با سلام و پوزش بابت تاخیر بسیار طولانی در انتشار مطالب، تو این پست میخوام در مورد اعتبارسنجی ورودیها با سناریوهای مختلف در فریمورک لاراول صحبت کنم. همونطور که مطلع هستید در لاراول راههای زیادی برای اعتبارسنجی دادهها وجود داره که هر کدوم مزایا یا معایبی دارند ولی من خودم از روشی استفاده میکنم که در ادامه بهش میپردازم.
Validationها در هر نرمافزار یا وباپلیکیشن از ملزومات توسعه هستند و هر برنامهنویسی نیاز داره تا در شرایط مختلف و سناریوهای مختلف ورودیهایی که از طرف کاربران میاد رو اعتبارسنجی کنه تا از درستی دادهها اطمینان حاصل کنه. یکی از روشهای این کار در Laravel اینه که ما تو کنترلر Ruleها رو تعریف کنیم و دادههای ورودی از سمت کاربر رو بهش بدیم و همونجا جواب رو برگردونیم. تو روش زیر یه خورده قضیه فرق میکنه. Ruleها در یه کلاس جدا برای هر موجودیت و در سناریوهای مختلف ذخیره میشن و ما بر اساس نیازمون از یکی از اون سناریوها در بخشها مختلف کدمون استفاده میکنیم.
برای اینکار من و رضا یه پکیچی نوشتیم که این تو ادامه قراره ازش استفاده کنیم. برای نصبش دستور زیر رو تو ترمینالتون اجرا کنید:
1 |
composer require laratalks/validator |
حالا فرض کنیم میخواهیم Ruleهای مربوط به کار با موجودیت User رو به وسیله این پکیج مدیریت کنیم. خب برای اینکار من یه فولدر به نام Validator در پوشه app ایجاد میکنم تا تمام کلاسهای مربوط به اعتبارسنجیهام توی این دایرکتوری باشن. برای شروع یک کلاس به نام app/Validators/UserValidator.php ایجاد میکنم به شکل زیر:
1 2 3 4 5 6 7 8 |
<?php namespace App\Validators; use Laratalks\Validator\AbstractValidator; class UserValdiator extends AbstractValdiator { } |
همونطور که دیدید کلاسهای اعتبارسنج باید از کلاس AbstractValidator مشتق بشن. در مرحله بعدی باید Ruleهامون رو به کلاس اضافه کنیم که برای نمونه من به کلاس بالا دو تا سناریو اضافه میکنم:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?php class UserValdiator extends AbstractValdiator { protected $registrationRules = [ 'name' => ['required', 'alpha_dash'], 'email' => ['required', 'email'], 'password' => ['required', 'min:8'], 'home_page' => ['required', 'url'] ]; protected $loginRules = [ 'email' => ['required', 'email'], 'password' => ['required'] ]; } |
من در کد بالا دو تا سناریو تعریف کردم، یکی برای اعتبارسنجی داده ورودی کاربر در هنگام ثبتنام و دیگری در هنگام ورود به سایت و اهراز حویت. تمام سناریوها به شکل بالا نوشته میشن یعنی نام سناریو + پسوند Rules.
بعد از اینکه سناریوها تعریف شدند، هر جایی میتونیم کلاس ولیدیشنمونو استفاده کنیم. حالا نحوه استفاده ش تو یه کنترلر به شکل زیر میتونه باشه:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<?php # UserController.php namespace Laratalks\Validator; use App\Validators\UserValidator; use Laratalks\Validator\Exceptions\ValidationException; class UserController extends Controller { public function register(Request $request, UserValidator $valdiator) { try { // validate user input $valdiator ->setScenario('registration') ->validate($request->all()); } catch (ValidationException $e) { // catch errors return $e->getErrors(); } } } |
مثال کد بالا یه کنترلر و یه متد برای ثبتنامه که ما اومدیم کلاس UserValdiator رو inject کردیم به متدمون و ازش استفاده کردیم. همونطور که میبینید کافیه هنگام استفاده، اسم سناریومون رو تعیین کنید و با صدا زدن متد validate() دادههامون رو برای اعتبارسنجی بهش بدیم.
اگر خطایی رخ بده، اکسپشن ValidationException فراخوانی میشه که این اکسپشن دارای متدی به نام getErrors()ـه که حاوی پیامهای خطای اعتبارسنجیمونه و اگر خطایی رخ نده برنامه به کارش ادامه میده.
به دو روش میشه روی دادن این خطا رو مدیریت کرد. یکیش به روشیه که تو مثال کد بالا میبینید و روش دیگه ش اینه که خطا رو تو فایل app/Exceptions/Handler.php مدیریت کنیم که روش دوم بیشتر هنگام نوشتن Apiها برای اینکه کد کمتری بنویسیم کاربرد بیشتری داره.
امیدوارم که این مطلب براتون مفید بوده باشه و اگر نظری یا انتقادی دارید از طریق فرم دیدگاههای زیر پست بیانش کنید یا اینکه بهم ایمیل بزنید.