سیستم اعتبارسنجی لاراول بدون شک یکی از بهترین ویژگی های این فریمورک هست که هر میتونه ازش استفاده کنه.
این سیستم با قوانین زیادی طراحی شده که توی راهنمای لاراول به صورت دقیق بهش اشاره شده.
داشتم توی اینترنت برای خودم یه چرخی میزدم یه سوال Quera پیدا کردم که سوال به این شکل بود
علی در حال پیادهسازی سیستم ثبتنام برای یک مرکز آموزشی است و باید سیستمی را پیادهسازی کند تا متقاضیان ثبتنام عکسی را در سیستم آپلود کنند.
شما باید قوانین احراز هویت زیر را روی عکس ها اعمال کنید:
فایل عکس الزامی است.
فایل باید حتما عکس و به فرمتهایjpeg,jpg,png
باشند.
شما باید قانون (rule) جدیدی را در برنامه تعریف کنید تا فقط امکان آپلود عکس با نامهای به فرمت [عدد]File مثلFile۱.png
و File۳۴۲.png
و... را بدهد و اگر نام فایل به این فرمت نبود و زبان سایت انگلیسی بود، خطایfile name is incorrect
و اگر زبان سایت فارسی بود خطاینام فایل صحیح نیست
را نمایش دهد.
برای انجام دادن ۲تا قانون اول برای احراز هویت خب کار سختی پیش رومون نیست فقط کافیه که بگیم
$request->validate([ "file"=>['required','image',"mimes:jpeg,jpg,png"] ]);
ولی برای قانون سوم نمیشه به همین راحتی عمل کرد... برای بررسی قانون سوم قبل از هر کاری باید به 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 دو ورودی داری که به ترتیب نشان دهنده نام فیلد و دیتای ورودی هست. چون ورودی ما فایل هست، کلاس فایل یکسری متد داره که به ما کمک میکنه راحت تر با فایل کار کنیم
برای این خواسته آخرین Rule رو برطرف کنیم باید یکم هم ریجکس استفاده کنیم و باید بررسی کنیم که
متد 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(), "", $value->getClientOriginalName()); return preg_match("/^File\d+$/", $fileName); }
اول امدم به php این رو فهموندم که $value از نوع Uploadfile هست توی خط بعدش امدم پسوند فایل رو از اسم فایل کم کردم و توی خط بعدی به وسیله regex چک کردم اون رو
پارامتر های ریجکس هم به ترتیب زیر هستند
خب حالا Rule ما کامل شده و باید استفادش کنیم که طرز استفادش به صورت زیر هست
$request->validate([ "img" => ['required', "mimes:jpg,png,jpeg", new \App\Rules\FileName] ]);
امیدوارم که ساده توضیح داده باشم و متوجه این آموزش شده باشید.