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

validation یا اعتبارسنجی در لاراول ۵٫۵ چگونه انجام می‌شود؟

جهت اعتبارسنجی داده‌های ورودی در برنامه، روش‌های مختلفی توسط لاراول ارائه شده است. در حالت پیش‌فرض، کلاس کنترلر پایه لاراول از یک خصوصیت ValidatesRequests استفاده می‌کند که یک متد مناسب ارائه می‌دهد که با قوانین اعتبارسنجی قدرتمند برای اعتبارسنجی درخواست‌های HTTP ورودی استفاده می‌شود.

اعتبارسنجی در لاراول
برای اطلاع از ویژگی‌های قدرتمند اعتبارسنجی در لاراول، توجه شما را به یک نمونه کامل از اعتبارسنجی فرم و پیام‌های خطایی که به کاربر نمایش داده می‌شود، جلب می‌کنیم:

تعریف مسیرها:
ابتدا فرض می‌کنیم، مسیرهای زیر در فایل routes/web.php تعریف شده‌اند:

مسیر GET یک فرم برای کاربر نمایش می‌دهد که بتواند یک پست جدید ایجاد کند، در حالی که، مسیر POST پست جدید را در پایگاه داده ذخیره می‌کند.

ایجاد کنترلر:
سپس، یک کنترلر ساده که این مسیرها را مدیریت می‌کند را در نظر می‌گیریم. فعلاً، متد store را به صورت خالی نگه می‌‌داریم:

پیاده سازی منطق اعتبارسنجی در لاراول
اکنون می‌توانیم، متد store را با کدهای اعتبارسنجی جهت تأیید اعتبار پست جدید کاربر پر کنیم. برای انجام این کار، از متد validate که توسط شئ Illuminate\Http\Request ارائه شده، استفاده می‌کنیم.اگر قوانین اعتبارسنجی تصویب شوند، کد در حالت نرمال به اجرا ادامه می‌دهد؛ با این حال، اگر اعتبارسنجی با خطا روبرو شود، یک استثنا یا exception پرتاب شده و به صورت خودکار پاسخ خطای مناسب به کاربر ارسال می‌شود. در مورد درخواست‌های HTTP سنتی، یک پاسخ redirect تولید می‌شود و کاربر را به صفحه قبل بازگشت می‌دهد، در حالی که در مورد درخواست‌های AJAX یک پاسخ JSON به کاربر ارسال می‌شود.
برای درک بهتر متد validate ، اجازه دهید نگاهی دوباره به متد store بیاندازیم:

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

توقف اجرا در اولین شکست اعتبارسنجی
گاهی اوقات ممکن است بخواهید، پس از اولین شکست در عملیات اعتبارسنجی یک صفت، اجرای قوانین اعتبارسنجی بعدی را بر روی آن صفت متوقف کنید. برای انجام این کار، باید قانون bail را به آن صفت اختصاص دهید:

در این مثال، اگر قانون unique در صفت title با شکست مواجه شود، قانون max بررسی نخواهد شد. قوانین به ترتیبی که مشخص شده‌اند، اعتبارسنجی می‌شوند.

صفت‌های تودرتو (nested attributes) در پارامترهای درخواست
اگر درخواست HTTP، شامل پارامترهای تودرتو (nested) باشد، در قوانین اعتبارسنجی می‌توان آن‌ها را با استفاده از علامت «نقطه» مشخص کرد:

نمایش خطاهای اعتبارسنجی در لاراول
اگر پارامترهای درخواست ورودی با قوانین اعتبارسنجی داده شده مطابقت نداشته باشند، چکار باید کرد؟ همانطور که قبلاً ذکر شد، لاراول به صورت خودکار کاربر را به مکان قبلی هدایت خواهد کرد. علاوه بر این، تمام خطاهای اعتبارسنجی به صورت خودکار در سشن نوشته می‌شوند.

نباید به صورت صریح پیام‌های خطا را در مسیر GET به view بایند کنیم. به این دلیل که لاراول خطاها را در داده‌های سشن بررسی می‌کند و اگر آن‌ها در دسترس باشند، به صورت خودکار آن‌ها را به view بایند می‌کند. متغیر $errors یک نمونه از کلاس Illuminate\Support\MessageBag است.

متغیر $errors توسط میدلور Illuminate\View\Middleware\ShareErrorsFromSession به view بایند می‌شود که به وسیله گروه middleware web ارائه می‌شود. زمانی که این middleware اعمال می‌شود متغیر $errors همواره در view در دسترس خواهد بود و در هر زمانی می‌توان از آن استفاده کرد.

بنابراین، در این مثال، زمانی که اعتبارسنجی ناموفق باشد، کاربر به متد create کنترلر برگردانده می‌شود و می‌توانیم پیام‌های خطا را در view به کاربر نمایش دهیم:

فیلدهای اختیاری در اعتبارسنجی لاراول
لاراول به صورت پیش‌فرض شامل میدلورهای TrimStrings و ConvertEmptyStringsToNull در پشته middleware عمومی برنامه است. این middlewarelها توسط کلاس App\Http\Kernel در پشته لیست شده‌اند. به همین دلیل، اگر بخواهید مقادیر null توسط عملیات اعتبارسنجی یک مقدار نامعتبر در نظر گرفته نشوند، باید فیلد‌های درخواست اختیاری را به عنوان nullable علامتگذاری کنید. به مثال زیر توجه کنید:

در این مثال، فیلد publish_at مشخص شده است که می‌تواند شامل یک مقدار null یا یک نمایش تاریخ معتبر باشد. اگر اصلاح کننده nullable به تعریف قانون اعتبارسنجی اضافه نشود، validator مقدار null را یک تاریخ نامعتبر در نظر می‌گیرد.

درخواست‌های AJAX در اعتبارسنجی لاراول
در این مثال، ما از یک فرم سنتی استفاده کردیم. با این حال، بسیاری از برنامه‌های کاربردی از درخواست‌های AJAX برای ارسال داده‌ها به برنامه استفاده می‌کنند. هنگام استفاده از متد validate در طول یک درخواست AJAX، لاراول یک پاسخ redirect به صفحه قبل ایجاد نمی‌کند. به جای این کار، لاراول یک پاسخ JSON شامل تمام خطاهای اعتبارسنجی ایجاد می‌کند. این پاسخ JSON با یک کد وضعیت ۴۲۲ HTTP به کاربر ارسال می‌شود.

اعتبارسنجی توسط form request در لاراول
برای نوشتن سناریوهای پیچیده جهت اعتبارسنجی داده‌ها، می‌توانید یک درخواست فرم یا form request ایجاد کنید. درخواست‌های فرم، کلاس‌های درخواست سفارشی هستند که منطق اعتبارسنجی را در درون خود جای می‌دهند. برای ایجاد یک کلاس form request، می‌توان از دستور آرتیسان make:request به صورت زیر استفاده کرد:

کلاس ایجاد شده در دایرکتوری app/Http/Requests قرار می‌گیرد. اگر این دایرکتوری موجود نباشد، در زمان اجرای دستور make:request ایجاد خواهد شد. اجازه دهید، چند قانون اعتبارسنجی را به متد rules اضافه کنیم:

چگونه می‌توان قوانین اعتبارسنجی را ارزیابی کرد؟ تمام آن چیزی که باید انجام داد، این است که form request را در متد کنترلر اعلان نوع یا type-hint کنید. درخواست فرم ورودی قبل از فراخوانی متد کنترلر اعتبارسنجی می‌شود. به این معنی که دیگر نیازی به وارد کردن منطق اعتبارسنجی خود در درون کلاس کنترلر نخواهید داشت:

اگر عملیات اعتبارسنجی ناموفق باشد، یک پاسخ redirect ایجاد شده و کاربر را به صفحه قبل برمی‌‌گرداند. خطاها نیز در سشن flash می‌شوند (نوشته می‌شوند) تا برای نمایش دادن به کاربر در دسترس قرا گیرند. اگر درخواست ورودی یک درخواست AJAX باشد، یک پاسخ HTTP با کد وضعیت ۴۲۲، شامل یک نمایش JSON از خطاهای اعتبارسنجی به کاربر نمایش داده خواهد شد.

اضافه کردن after hook به form request

اگر بخواهید یک hook after را به form request اضافه کنید، می‌توانید از متد withValidator استفاده کنید. این متد اعتبارسنجی ایجاد شده را به صورت کامل دریافت می‌کند و این امکان را می‌دهد که قبل از ارزیابی قوانین اعتبارسنجی به صورت واقعی، بتوانید متدهایش را فراخوانی کنید:

احراز هویت Form Request
کلاس form request نیز شامل یک متد authorize است. می‌توانید در این متد، مجوز کاربر احراز هویت شده به ویرایش یک منبع داده شده را بررسی کنید. برای مثال، می‌توانید تعیین کنید که آیا کاربر کامنتی بر روی یک پست دارد که می‌خواهد آن را ویرایش کند؟

از آنجایی که تمام form requestها، از کلاس request لاراول ارث‌ بری می‌کنند، می‌توان از متد user برای دسترسی به کاربری که در حال حاضر احراز هویت شده است، استفاده کرد. به فراخوانی متد route در مثال بالا توجه کنید، این متد امکان می‌دهد که به پارامترهای URI تعریف شده در فراخوانی مسیر مانند پارامتر {comment} در مثال زیر دسترسی داشته باشید:

اگر متد authorize مقدار false را برگرداند، یک پاسخ HTTP با کد وضعیت ۴۰۳ به صورت خودکار بازگردانده می‌شود و متد کنترلر اجرا نمی‌شود.
اگر قصد دارید منطق احراز هویت را در قسمت دیگری از برنامه خود بگنجانید، می‌‌توانید به راحتی مقدار true را از متد authorize برگردانید:

سفارشی سازی پیام‌های خطای اعتبارسنجی
می‌توان پیام‌های خطای مورد استفاده در form request را با بازنویسی متد messages سفارشی کرد. این متد باید آرایه‌ای از صفت و قانون اعتبارسنجی آن و همچنین پیام‌های خطای مربوط به آن‌ها را بازگرداند:

ایجاد اعتبارسنجی به صورت دستی در لاراول
اگر نمی‌خواهید از متد validate در درخواست استفاده کنید، می‌توانید یک نمونه اعتبارسنجی را به صورت دستی با استفاده از facade Validator ایجاد کنید. متد make در facade یک نمونه validator جدید ایجاد می‌کند:

اولین آرگومانی که به متد make انتقال داده می شود، داده‌ای است که باید اعتبارسنجی شود. آرگومان دوم قوانین اعتبارسنجی است که باید بر روی داده‌ها اعمال شوند.
پس از بررسی داده، اگر اعتبارسنجی ناموفق باشد؛ می‌توان از متد withErrors برای flash کردن پیام‌های خطا در session استفاده کرد. هنگام استفاده از این متد متغیر errors$ به صورت خودکار با viewهای برنامه پس از redirect شدن، به اشتراک گذاشته می‌شود که امکان می‌دهد به سادگی بتوانید، آن‌ها را به کاربر نمایش دهید. متد withErrors یک validator، MessageBag یا یک array می‌پذیرد.

تغییر مسیر اتوماتیک (automatic redirection) در اعتبارسنجی لاراول

اگر می‌خواهید، به صورت دستی یک نمونه validator ایجاد کنید، اما هنوز هم از تغییرمسیر (redirect) خودکار ارائه شده توسط متد validate درخواست استفاده می‌کنید، می‌توانید متد validate را بر روی نمونه validator موجود فراخوانی کنید. اگر اعتبارسنجی ناموفق باشد، کاربر به صورت خودکار redirect می‌شود (به صفحه قبلی برمی‌گردد) و یا در صورت استفاده از درخواست AJAX یک پاسخ JSON به شما ارائه خواهد داد:

بسته‌های خطای نامگذاری شده (Named Error Bags)
اگر چند فرم در یک صفحه داشته باشید، می‌توانید MessageBag خطاها را نامگذاری کنید که امکان اینکه پیام‌های خطا را برای یک فرم خاص بازیابی کنید را فراهم می‌کند. جای نگرانی نیست، می‌توانید نام مشخص شده را به عنوان آرگومان دوم به withErrors انتقال دهید:

پس از آن، می‌توانید به نمونه MessageBag از متغیر $errors دسترسی داشته باشید:

پس از اعتبار سنجی Hook
همچنین validator اجازه می‌دهد تا پس از کامل شدن عملیات اعتبارسنجی، attach callbacks را اجرا کنید. این موضوع این امکان را می‌دهد که بتوانید به راحتی اعتبارسنجی بیشتری انجام دهید و حتی پیام‌های خطای بیشتری را به مجموعه پیام‌‌های خطا اضافه کنید. برای شروع کار، می‌توانید از متد after بر روی یک نمونه validator استفاده کنید:

کار با پیام‌های خطا در اعتبارسنجی لاراول
پس از فراخوانی متد errors بر روی یک نمونه Validator ، یک نمونه کلاس Illuminate\Support\MessageBag دریافت خواهید کرد که متدهای مختلفی را برای کار با پیام‌های خطا ارائه می‌دهد. متغیر $errors که به صورت خودکار برای همه viewها در دسترس است نیز نمونه‌ای از کلاس MessageBag است.

بازیابی اولین پیام خطا برای یک فیلد
برای بازیابی اولین پیام خطا برای یک فیلد، می‌توانید از متد first استفاده کنید:

بازیابی تمام پیام‌های خطا برای یک فیلد
اگر نیاز به بازیابی یک آرایه از تمام پیام‌های خطا برای یک فیلد دارید، می‌توانید از متد get استفاده کنید:

اگر یک فیلد فرم آرایه را اعتبارسنجی می‌کنید، می‌توانید تمام پیام‌های خطا را برای هر عنصر آرایه با استفاده از کاراکتر * بازیابی کنید.

بازیابی تمام پیام‌های خطا برای تمام فیلدها
برای بازیابی آرایه‌ای از تمام پیام‌های خطا برای تمام فیلدها، می‌توانید از متد all استفاده کنید:

تعیین وجود پیام خطا برای یک فیلد
متد has برای تعیین اینکه آیا پیام‌ خطا برای یک فیلد مشخص وجود دارد یا خیر، استفاده می‌شود:

پیام‌های خطای سفارشی در اعتبارسنجی لاراول
در صورت نیاز، می‌توانید به جای استفاده از حالت پیش‌فرض، پیام‌های خطای اعتبارسنجی را به صورت سفارشی ایجاد کنید. چندین راه برای ایجاد پیام‌های خطا به صورت سفارشی وجود دارد. در روش اول، می‌توانید پیام‌های خطای سفارشی را به عنوان آرگومان سوم به Validator::make انتقال دهید:

در این مثال، بخش attribute: با نام واقعی فیلدی که اعتبارسنجی ‌می‌شود جایگزین می‌شود. همچنین می‌توانید از نام‌‌های دیگر در پیام‌های اعتبارسنجی استفاده کنید.

تعیین پیام خطای سفارشی برای یک صفت مشخص
گاهی اوقات ممکن است بخواهید، فقط برای یک فیلد خاص پیام‌های خطای سفارشی ایجاد کنید. این کار را می‌توانید با استفاده از علامت «نقطه» انجام دهید. ابتدا، اسم صفت را مشخص کنید و به دنبال آن از قانون اعتبارسنجی استفاده کنید:

تعیین پیام‌های خطای سفارشی در فایل‌های language
در اغلب موارد، به جای انتقال مستقیم پیام‌های خطای سفارشی خود به validator می‌توانید آن‌ها را در یک فایل language قرار دهید. برای انجام این کار، پیام‌های خود را به آرایه custom در فایل resources/lang/xx/validation.php اضافه کنید.

مشخص کردن صفت سفارشی در فایل‌های language
اگر بخواهید بخش attribute: از پیام اعتبارسنجی با یک نام attribute سفارشی جایگزین شود، می‌توانید نام سفارشی خود را در آرایه attributes از فایل resources/lang/xx/validation.php مشخص کنید:

باید بدانید اعتبارسنجی یکی از مهم‌ترین مباحث در زمینه برنامه نویسی تحت وب است. به همین سبب حجم اموزشی آن نیز زیاد است. اگر مشتاق به فراگیری کامل این مبحث هستید، ما را دنبال کنید.

منبع : سایت لاراول

validation در لاراول ۵٫۵
Tagged on:         

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *