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

اعتبار سنجی سفارشی در لاراولسیستم اعتبار‌سنجی لاراول بدون شک یکی از بهترین ویژگی های این فریم‌ورک هست که هر میتونه ازش استفاده کنه.این سیستم با قوانین زیادی طراحی شده که توی راهنمای لاراول به صورت دقیق بهش اشاره شده.داشتم توی اینترنت برای خودم یه چرخی میزدم یه سوال 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