آموزش ساخت پیام های اعتبارسنجی سفارشی در لاراول

30 آبان 1397
laravel-validation

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

سر فصل های آموزش اعتبارسنجی در لاراول

  • چرا سفارشی سازی پیام های اعتبارسنجی
  • ساخت فرم تماس
  • پیام های خطای اعتبارسنجی در لاراول چگونه کار می کند؟
  • استفاده از فایل زبان
  • قرار دادن متن پیام خطای سفارشی داخل کدهای برنامه

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

در این آموزش فرض می کنیم که با اصول اولیه اعتبارسنجی در لاراول آشنا هستید و در اینجا نمی خواهیم آن را پوشش دهیم.

چرا سفارشی سازی پیام های اعتبارسنجی

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

با سفارشی کردن پیام ها، هنگام بروز یک خطا در زمان ارسال فرم می توانید هر پیامی که تمایل دارید را به کاربر نمایش دهید و به پیام پیش فرض لاراول محدود نیستید.

ساخت فرم تماس

در این آموزش من از یک فرم تماس برای نمایش طرز کار پیام های اعتبارسنجی استفاده می کنم.

ابتدا برای شروع یک برنامه جدید لاراول ایجاد می کنیم.

من ترجیح می دهم از laravel installer استفاده کنیم، اما شما با هر روشی که تمایل دارید می توانید اینکار را انجام دهید.

laravel new laravel-custom-validation-error-messages

نام این پروژه را laravel-custom-validation-error-message گذاشتیم، اما شما هر  نامی که خواستید می توانید برای آن انتخاب کنید. حال یک روت برای فرم تماس ایجاد می کنیم. کدهای زیر را در فایل routes ->web.php قرار دهید.

// routes/web.php

Route::get('contact', 'ContactsController@showContactForm');
Route::post('contact', 'ContactsController@contact');

پس یک کنترلر با متدهایی که در فایل روت مشخص کرده ایم، ایجاد می کنیم.

php artisan make:controller ContactsController

حال فایل contacts controller را باز کرد و کدهای زیر را در آن اضافه کنید.

// app/Http/Controllers/ContactsController.php

/**
 * Show the contact form
 * 
 * @return Response
 */
public function showContactForm()
{
     return view('contact');
}

متد ()showcontactform تنها یک ویو با نام contacf (که بعداً ایجاد می کنیم) را لود می کند. در این فایل ویو، فرم تماس مان را ایجاد می کنیم. کاربران می توانند پیام هایشان را از طریق این فرم برایمان ارسال کنند.

برای این منظور، یک ویو با نام contact.blade.php در فولدر views ایجاد کنید و کدهای زیر را به این فایل اضافه کنید:

// resources/views/contact.blade.php

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Contact Form</title>

    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">

    <style>
        body {
            padding-top: 100px;
        }
    </style>
</head>
<body>
    <div class="container">
        <div class="row">
            <div class="col-md-6 col-md-offset-3">

                @if (session('status'))
                    <div class="alert alert-success">
                        {{ session('status') }}
                    </div>
                @endif

                <form action="{{ url('contact') }}" method="POST">

                    {{ csrf_field() }}

                    <div class="form-group{{ $errors->has('name') ? ' has-error' : '' }}">
                        <label for="name">Name</label>
                        <input type="text" name="name" class="form-control" value="{{ old('name')}}">

                        <small class="text-danger">{{ $errors->first('name') }}</small>
                    </div>

                    <div class="form-group{{ $errors->has('email') ? ' has-error' : '' }}">
                        <label for="email">Email Address</label>
                        <input type="email" name="email" class="form-control" value="{{ old('email')}}">

                        <small class="text-danger">{{ $errors->first('email') }}</small>
                    </div>

                    <div class="form-group{{ $errors->has('message') ? ' has-error' : '' }}">
                        <label for="message">Message</label>
                        <textarea name="message" class="form-control" rows="5">{{ old('message')}}</textarea>

                        <small class="text-danger">{{ $errors->first('message') }}</small>
                    </div>

                    <div class="form-group">
                        <button type="submit" class="btn btn-primary">Submit</button>
                    </div>

                </form>
            </div>
        </div>
    </div>
</body>
</html>

کدهای بالا یک فرم ساده به همراه فیلدهای name، email و message ایجاد می کند. حال با کنترلر contacts controller برگردید و کدهای زیر را به آن اضافه کنید.

/ app/Http/Controllers/ContactsController.php

/**
 * Handle the actual contacting
 * 
 * @param  Request $request
 * @return Response
 */
public function contact(Request $request)
{
        $rules = [
            'name' => 'required',
            'email' => 'required|email',
            'message' => 'required|min:5',
        ];

        $this->validate($request, $rules);

        // send contact details to email address

        return back()->with("status", "Your message has been received, We'll get back to you shortly.");
}

همان طور که در کدهای بالا دیدید، ابتدا یک آرایه ای از قوانین اعتبارسنجی ایجاد می کنیم، سپس این آرایه را به متد ()validate پاس می دهیم.

متد ()validate داده هایی که از طریق فرم ارسال می شود را مطابق با قوانین اعتبارسنجی که تعریف کردیم را اعتبارسنجی می کند.

در صورتی که داده های ارسالی از فرم معتبر بود، اجرای برنامه از خط بعدی شروع می شود، در غیر اینصورت یک پیام خطای اعتبارسنجی نمایش داده می شود.

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

php artisan serve

بعد از باز شدن مرورگر به آدرس http://localhost:8000/contact بروید. سپس بدون اینکه در فیلدهای فرم مقداری وارد کنید، روی دکمه submit کلیک کنید. می بینید که پیام خطای پیش فرض مربوط به اعتبارسنجی، نمایش داده می شود.

نمایش پیام خطای اعتبارسنجی در لاراول

پیام خطای اعتبارسنجی در لاراول چگونه کار می کند؟

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

همانطور که در تصویر بالا می بینید، نام هر کدام از فیلدهای فرم (name، email، و ...) را گرفته و یک پیام خطای اعتبارسنجی مربوط به هر کدام از این فیلدها، نمایش می دهد.

اما چطور می توان به جای این پیام های پیش فرض، پیام های سفارشی خودمان را ایجاد کنیم؟

روش اول: استفاده از فایل زبان یا language

راحت ترین روش برای سفارشی کردن این پیام ها، استفاده از فایل language است.

این فایل در مسیر resources -> lang قرار دارد. در این آموزش ما فقط از فایل validation.php استفاده خواهیم کرد.

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

'required' => 'The :attribute field is required.'

یک place holder به نام attribute: داریم که هنگام اجرای برنامه با نام فیلدهای فرم (نام عناصر input فرم) جایگزین می شود. با تغییر متن این پیام، به آسانی می توانیم یک پیام سفارشی ایجاد کنیم.

// resources/lang/en/validation.php

'required' => 'The :attribute field can not be blank.'

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

نمایش پیام خطای اعتبار سنجی فیلدهای یک فرم در لاراول

اما اگر به سفارشی سازی بیشتر یک پیام نیاز داشتیم، باید چکار کنیم؟ مثلاً بخواهیم پیام "we need your email address" را نمایش دهیم.

با کد زیر می توانیم برای هر کدام از عناصر فیلدهای ورودی فرم، یک پیام اعتبارسنجی سفارشی ایجاد کنیم

// resources/lang/en/validation.php

'custom' => [
        'email' => [
            'required' => 'We need your email address also.',
        ],
]

همانطور که در تصویر زیر می بینید، پیام خطای کد بالا تنها به فیلد email اعمال می شود.

نمایش پیام خطای مربوط به اعتبار سنجی فرم در لاراول

اگر در فایل validation.php به سمت پائین اسکرول کنید، کدهای زیر را می بینید.

/*
|--------------------------------------------------------------------------
| Custom Validation Attributes
|--------------------------------------------------------------------------
|
| The following language lines are used to swap attribute place-holders
| with something more reader friendly such as E-Mail Address instead
| of "email". This simply helps us make messages a little cleaner.
|
*/

'attributes' => []

حال فرض کنید که در متن پیام اعتبارسنجی، بخواهیم به جای name عبارت full name نمایش داده شود، برای اینکار کد زیر را وارد کنید.

// resources/lang/en/validation.php

'attributes' => [
        'name' => 'Full Name'
]

با این کار عبارت full name جایگزین attribute: می شود.

نمایش پیام خطای اعتبارسنجی فرم در لاراول

تمام کدهای بالا صرف نظر از اینکه شما از درخواست های فرم (form request) استفاده کنید یا از متد validate و یا حتی از validator facade، به درستی کار خواهد کرد.

روش دوم: قرار دادن متن پیام خطای سفارشی داخل کدهای برنامه

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

بسته به اینکه چطور اعتبارسنجی را در برنامه پیاده کنید، دو روش برای ایجاد پیام خطای سفارشی وجود دارد.

این روش ها عبارتند از استفاده از متدهای ()validate و یا ()validator::make برای ایجاد پیام های خطای سفارشی.

این متدها چهار آرگومان می گیرند (داده های ارسال شده، قوانین اعتبارسنجی، متن پیام ها و نام فیلدهای ورودی فرم).

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

کدهای زیر را در متد contact() مربوط به کنترلر contacts controllers قرار دهید.

// app/Http/Controllers/ContactsController.php

/**
 * Handle the actual contacting
 * 
 * @param  Request $request
 * @return Response
 */
public function contact(Request $request)
{
    $rules = [
        'name' => 'required',
        'email' => 'required|email',
        'message' => 'required|min:5',
    ];

    $customMessages = [
        'required' => 'The :attribute field can not be blank.'
    ];

    $this->validate($request, $rules, $customMessages);

    // send contact details to email address

    return back()->with("status", "Your message has been received, We'll get back to you shortly.");
}

حال اگر سعی کنید بدون پر کردن فیلدهای input فرم را submit کنید، پیام خطای مناسب نمایش داده می شود.

نمایش پیام خطای سفارشی در لاراول

همچنین می توانید پیام های خطاهای اعتبارسنجی لاراول را برای یک فیلد خاص ایجاد کنید.

آرایه custom message را مطابق بروزرسانی کنید.

// app/Http/Controllers/ContactsController.php

$customMessages = [
    'name.required' => 'Yo, what should I call you?',
    'email.required' => 'We need your email address also',
    'message.required'  => 'c\'mon, you want to contact me without saying anything?',
 ];

اعتبار سنجی یک فیلد خاص در لاراول

روش اعتبارسنجی در خواست های ارسال شده از یک فرم، کمی متفاوت است. برای اینکار یک درخواست (request) به نام contactformrequest با دستور زیر ایجاد می کنیم.

php artisan make:request ContactFormRequest

سپس قوانین اعتبارسنجی که در زیر می بینید را در فایل ContactFormRequest که به تازگی ایجاد کردیم، قرار دهید:

// app/Http/Requests/ContactFormRequest.php

/**
 * Get the validation rules that apply to the request.
 *
 * @return array
 */
public function rules()
{
    return [
        'name' => 'required',
        'email' => 'required|email',
        'message' => 'required|min:5',
    ];
}

در اینجا هم مانند کاری که در کنترلر contactscontroller کردیم، قوانین اعتبارسنجی مان را در متد ()rule ایجاد می کنیم.

حال پیام اعتبارسنجی مان را اضافه می کنیم.

// app/Http/Requests/ContactFormRequest.php

/**
 * Get the error messages for the defined validation rules.
 *
 * @return array
 */
public function messages()
{
    return [
        'name.required' => 'Yo, what should I call you?',
        'email.required' => 'We need your email address also',
        'message.required'  => 'c\'mon, you want to contact me without saying anything?',
    ];
}

برای پیاده سازی پیام خطای سفارشی هنگام استفاده از form request، کافی است که یک متد با نام ()message را به فایل contactformrequest اضافه کنیم.

متد()message شامل یک آرایه از متن پیام های اعتبارسنجی سفارشی مان است. حال می توانیم از فایل contactformrequest داخل کنترلر contactscontrollers استفاده کنیم.

// app/Http/Controllers/ContactsController.php

// remember to use ContactFormRequest
use App\Http\Requests\ContactFormRequest;

/**
 * Handle the actual contacting
 * 
 * @param  Request $request
 * @return Response
 */
public function contact(ContactFormRequest $request)
{
    // send contact details to email address

    return back()->with("status", "Your message has been received, We'll get back to you shortly.");
}

با اجرای کد بالا همان نتیجه قبلی را دریافت می کنید.

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

نویسنده شوید
دیدگاه‌های شما

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.