آموزش لاراول 7: آموزش Validation در لاراول

مقدمه

لاراول چندین روش مختلف برای تأیید اعتبار داده های ورودی برنامه ارائه می دهد. به طور پیش فرض ، کلاس controller لاراول از یک ویژگی ValidatesRequests استفاده می کند که یک روش مناسب برای اعتبار سنجی درخواست های HTTP ورودی با انواع رول های معتبر اعتبار سنجی را فراهم می کند.

Validation Quickstart

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

تعریف Route ها

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

Route::get('post/create', '[email protected]');

Route::post('post', '[email protected]');

GET route یک فرم برای کاربر ایجاد می کند تا یک بلاگ جدید تعریف کند ، در حالی که POST route بلاگ جدید را در دیتابیس ذخیره می کند.

ایجاد Controller

بعد ، بیایید نگاهی به یک controller ساده بیندازیم که این route ها را کنترل می کند.متد store را فعلاً خالی می گذاریم:

‌<‌?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;

class PostController extends Controller
{
    /**
     * Show the form to create a new blog post.
     *
     * @return Response
     */
    public function create()
    {
        return view('post.create');
    }

    /**
     * Store a new blog post.
     *
     * @param  Request  $request
     * @return Response
     */
    public function store(Request $request)
    {
        // Validate and store the blog post...
    }
}

نوشتن Validation Logic

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

برای درک بهتر متد validate ، بیایید دوباره به متد store برگردیم:

/**
 * Store a new blog post.
 *
 * @param  Request  $request
 * @return Response
 */
public function store(Request $request)
{
    $validatedData = $request-‌>‌validate([
        'title' =‌>‌ 'required|unique:posts|max:255',
        'body' =‌>‌ 'required',
    ]);

    // The blog post is valid...
}

همانطور که مشاهده می کنید ، ما رول های اعتبارسنجی مورد نظر را با متد validate ارسال می کنیم. باز هم ، اگر اعتبار سنجی انجام نشود ، پاسخ مناسب به طور خودکار ایجاد می شود. اگر اعتبار سنجی انجام شود ،controller ما به طور معمول ادامه خواهد داد.

 رول های اعتبار سنجی ممکن است به عنوان آرایه ای از رول ها به جای یک رشته |مشخص شوند :

$validatedData = $request-‌>‌validate([
    'title' =‌>‌ ['required', 'unique:posts', 'max:255'],
    'body' =‌>‌ ['required'],
]);

شما می توانید از متد validateWithBag برای تأیید یک درخواست و ذخیره هرگونه پیام خطا در یک named error bag استفاده کنید:

$validatedData = $request-‌>‌validateWithBag('post', [
    'title' =‌>‌ ['required', 'unique:posts', 'max:255'],
    'body' =‌>‌ ['required'],
]);
Stop Validation Failure

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

$request-‌>‌validate([
    'title' =‌>‌ 'bail|required|unique:posts|max:255',
    'body' =‌>‌ 'required',
]);

در این مثال ، اگر رول unique در title attribute انجام نشود یا بهتر است بگوییم fail شود ، رول max بررسی نمی شود. رول ها  به ترتیب تخصیص validate خواهند شد.

نکته ای در مورد Attribute های تودرتو

اگر درخواست HTTP شما شامل پارامترهای "nested" باشد ، می توانید آنها را دررول های validation  خود با استفاده از"syntax "dot مشخص کنید:

$request-‌>‌validate([
    'title' =‌>‌ 'required|unique:posts|max:255',
    'author.name' =‌>‌ 'required',
    'author.description' =‌>‌ 'required',
]);

نمایش ارورهای Validation 

بنابراین ، اگر پارامترهای درخواست ورودی validation rule ها را ارسال نکنند ، چه می شود؟ همانطور که قبلاً ذکر شد ، لاراول کاربر را به طور خودکار به مکان قبلی خود هدایت می کند. علاوه بر این ، تمام خطاهای اعتبارسنجی به طور خودکار  flashed to session می شوند.

 توجه کنید که لازم نبود error mesage ها را به view در روت GET خود متصل کنیم. به این دلیل که لاراول خطاهای موجود در داده های session را بررسی می کند و در صورت وجود آنها را به صورت خودکار به view متصل می کند. متغیر $errors نمونه ای از Illuminate\Support\MessageBag خواهد بود.

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

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

‌<‌!-- /resources/views/post/create.blade.php --‌>‌

‌<‌h1‌>‌Create Post‌<‌/h1‌>‌

@if ($errors-‌>‌any())
    ‌<‌div class="alert alert-danger"‌>‌
        ‌<‌ul‌>‌
            @foreach ($errors-‌>‌all() as $error)
                ‌<‌li‌>‌{{ $error }}‌<‌/li‌>‌
            @endforeach
        ‌<‌/ul‌>‌
    ‌<‌/div‌>‌
@endif

‌<‌!-- Create Post Form --‌>‌
دستور  @error 

همچنین می توانید از دستور blade @error برای بررسی سریع وجود پیام های خطای validation یک attribute مشخص استفاده کنید. در دستور @error ، می توانید متغیر $message را برای نمایش پیام خطا echoکنید:

‌<‌!-- /resources/views/post/create.blade.php --‌>‌

‌<‌label for="title"‌>‌Post Title‌<‌/label‌>‌

‌<‌input id="title" type="text" class="@error('title') is-invalid @enderror"‌>‌

@error('title')
    ‌<‌div class="alert alert-danger"‌>‌{{ $message }}‌<‌/div‌>‌
@enderror

فیلدهای Optional 

به طور پیش فرض ، Laravel شامل میان افزار TrimStrings و ConvertEmptyStringsToNull در global middleware stack برنامه شما است. این میان افزارها توسط کلاس App\Http\Kernel در stack لیست شده اند. به همین دلیل ، اگر نمی خواهید validator مقادیر null را invalid بداند ، باید فیلدهای درخواست "optional" خود را به عنوان nullable علامت گذاری کنید. مثلا:

$request-‌>‌validate([
    'title' =‌>‌ 'required|unique:posts|max:255',
    'body' =‌>‌ 'required',
    'publish_at' =‌>‌ 'nullable|date',
]);

در این مثال ، ما مشخص می کنیم که فیلد publish_at ممکن است null یا یک valid date باشد. اگر nullable modifier به تعریف rule اضافه نشود ، validator مقدار null را یک invalid date می داند.

AJAX Requests & Validation

در این مثال ، ما از فرم traditional برای ارسال داده ها به برنامه استفاده کردیم. با این حال ، بسیاری از برنامه ها از درخواست های AJAX استفاده می کنند. هنگام استفاده از متد validate در هنگام AJAX request، لاراول پاسخی برای redirect تولید نمی کند. در عوض ، لاراول یک JSON response تولید می کند که شامل تمام خطاهایvalidation است. این JSON response با کد وضعیت 422 HTTP ارسال می شود.

اعتبارسنجی فرم درخواست

ایجاد فرم درخواستها

برای سناریوهای validation پیچیده تر ، ممکن است بخواهید "form request" ایجاد کنید. که شامل logic اعتبار سنجی است. برای ایجاد کلاس form request ، از دستور make:request Artisan CLI استفاده کنید:

php artisan make:request StoreBlogPost

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

/**
 * Get the validation rules that apply to the request.
 *
 * @return array
 */
public function rules()
{
    return [
        'title' =‌>‌ 'required|unique:posts|max:255',
        'body' =‌>‌ 'required',
    ];
}

ادامه دارد...

× در حال پاسخ به: