رضا پارسیان
رضا پارسیان
خواندن ۱ دقیقه·۳ سال پیش

اعتبار سنجی سفارشی در لاراول

اعتبار سنجی سفارشی در لاراول
اعتبار سنجی سفارشی در لاراول

سیستم اعتبار‌سنجی لاراول بدون شک یکی از بهترین ویژگی های این فریم‌ورک هست که هر میتونه ازش استفاده کنه.
این سیستم با قوانین زیادی طراحی شده که توی راهنمای لاراول به صورت دقیق بهش اشاره شده.

داشتم توی اینترنت برای خودم یه چرخی میزدم یه سوال Quera پیدا کردم که سوال به این شکل بود

علی در حال پیاده‌سازی سیستم ثبت‌نام برای یک مرکز آموزشی است و باید سیستمی را پیاده‌سازی کند تا متقاضیان ثبت‌نام عکسی را در سیستم آپلود کنند.
شما باید قوانین احراز هویت زیر را روی عکس ها اعمال کنید:
فایل عکس الزامی است.
فایل باید حتما عکس و به فرمت‌های jpeg,jpg,png باشند.
شما باید قانون ‍‍‍‍(rule) جدیدی را در برنامه تعریف کنید تا فقط امکان آپلود عکس با نام‌های به فرمت [عدد]File مثل File۱.png و ‍‍File۳۴۲.png و... را بدهد و اگر نام فایل به این فرمت نبود و زبان سایت انگلیسی بود، خطای file name is incorrect و اگر زبان سایت فارسی بود خطای نام فایل صحیح نیست را نمایش دهد.

برای انجام دادن ۲تا قانون اول برای احراز هویت خب کار سختی پیش رومون نیست فقط کافیه که بگیم

$request->validate([ &quotfile&quot=>['required','image',&quotmimes:jpeg,jpg,png&quot] ]);

ولی برای قانون سوم نمیشه به همین راحتی عمل کرد... برای بررسی قانون سوم قبل از هر کاری باید به Rule جدید به پروژه خودمون اضافه کنیم

php artisan make:rule RuleName

دستور بالا برای ما یک فایل php توی مسیر app/Rules می‌سازه.

<?php namespace App\Rules; use Illuminate\Contracts\Validation\Rule; class FileName implements Rule { /** * Create a new rule instance. * * @return void */ public function __construct() { // } /** * Determine if the validation rule passes. * * @param string $attribute * @param mixed $value * @return bool */ public function passes($attribute, $value) { // } /** * Get the validation error message. * * @return string */ public function message() { return 'The validation error message.'; }}

برای بررسی شرط باید متد passes و برای بازگشت پیام خطا باید متد message رو بازنویسی کنید. متد passes دو ورودی داری که به ترتیب نشان دهنده نام فیلد و دیتای ورودی هست. چون ورودی ما فایل هست، کلاس فایل یکسری متد داره که به ما کمک می‌کنه راحت تر با فایل کار کنیم

  • store و move برای ذخیره عکس
  • get برای گرفتن محتوای فایل
  • getClientOriginalExtension برای گرفتن پسوند فایل ارسالی
  • getClientOriginalName برای گرفتن اسم فایل ارسالی

برای این خواسته آخرین Rule رو برطرف کنیم باید یکم هم ریجکس استفاده کنیم و باید بررسی کنیم که

  • شروع اسم فایل با File باشه
  • پایان اسم عدد باشه به هر تعدادی

متد passes به این صورت بازنویسی میشه

/** * Determine if the validation rule passes. * * @param string $attribute * @param mixed $value * @return bool */ public function passes($attribute, $value): bool { /** * @var $value UploadedFile */ $fileName=str_replace('.' . $value->getClientOriginalExtension(), &quot&quot, $value->getClientOriginalName()); return preg_match(&quot/^File\d+$/&quot, $fileName); }

اول امدم به php این رو فهموندم که $value از نوع Uploadfile هست توی خط بعدش امدم پسوند فایل رو از اسم فایل کم کردم و توی خط بعدی به وسیله regex چک کردم اون رو

پارامتر های ریجکس هم به ترتیب زیر هستند

  • ^ برای بررسی کردن اول خط
  • File هم ثابت ما هست
  • \d برای پیدا کردن عدد
  • +هم روی پارامتر قبلی اعمال میشه که میگه از پارامتر قبلی حداقل باید یکی وجود داشته باشه
  • $ برای بررسی کردن انتهای خط

خب حالا Rule ما کامل شده و باید استفادش کنیم که طرز استفادش به صورت زیر هست

$request->validate([ &quotimg&quot => ['required', &quotmimes:jpg,png,jpeg&quot, new \App\Rules\FileName] ]);

امیدوارم که ساده توضیح داده باشم و متوجه این آموزش شده باشید.


https://rp76.ir/blog/post/%D8%A7%D8%B9%D8%AA%D8%A8%D8%A7%D8%B1-%D8%B3%D9%86%D8%AC%DB%8C-%D8%B3%D9%81%D8%A7%D8%B1%D8%B4%DB%8C-%D8%AF%D8%B1-%D9%84%D8%A7%D8%B1%D8%A7%D9%88%D9%84


الان لاراول کار می‌کنم ولی هنوز سایتم همونه https://Rp76.ir
شاید از این پست‌ها خوشتان بیاید