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

ترجمه و تالیف : رضا جمال زاده
تاریخ انتشار : 22 مهر 98
خواندن در 3 دقیقه
دسته بندی ها : لاراول

یکی از ویژگی‌های فوق العاده لاراول اعتبارسنجی درخواست ها(Request Vaildation) است. این ویژگی مفهوم اعتبارسنجی را به لایه‌ا‌ی جدا – لایه  Request- منتقل می‌کند که این لایه در پوشه app/Http/Requests قرار دارد. همانطور که می‌دانید پس از اعتبارسنجی فرم ارورهای به وجود آمده به صورت خودکار نمایش داده می‌شوند. حالا سوال اینجاست که اگر ما بخواهیم پیغام‌های این ارورها را سفارشی سازی کنیم چه کاری باید انجام دهیم؟

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

 در ابتدا به بررسی چگونگی کار کردن اعتبارسنجی در لاراول می‌پردازیم. برای توضیح این مفهوم از یک مثال ساده استفاده می‌کنیم.

1-در لایه view یک فرم خیلی ساده مانند زیر می‌سازیم:

{!! Form::open(['route' => 'users.store']) !!}
{!! Form::text('name', old('name'), ['placeholder' => 'Name']) !!}
{!! Form::submit('Save') !!}

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

2-سپس یک کلاس درخواست(request class) در پوشه app/Http/Requests ایجاد می‌کنیم. بیایید نگاهی به آن بیاندازیم:

namespace App\Http\Requests;

use App\Http\Requests\Request;

class CreateUserRequest extends Request {

	/**
	 * Determine if the user is authorized to make this request.
	 *
	 * @return bool
	 */
	public function authorize()
	{
		return true;
	}

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

}

در این کلاس تنها کدی که ما به آن اضافه می‌کنیم 'name' => 'required' است، این خط کد در واقع نام فیلد و قانونی است که ما برای اعتبار سنجی نیاز داریم.

۳-در کنترلر خود و در اکشن store() آن کلاس درخواست CreateUserRequest که پیش از این ایجاد کرده‌ایم را به عنوان پارامتر در این اکشن قرار می‌دهیم.

public function store(CreateUserRequest $request) { ...

۴-در ادامه به نمایش پیغام ارور در view می پردازیم. در صورتی که فیلد مورد نظر خالی باشد کاربر همراه با متغیر $error به صفحه قبل ریدایرکت می‌شود و پیغام خطا نمایش داده می‌شود. برای نمایش پیغام خطا کد زیر را در view مورد نظر خود قرار می‌دهیم:

@if ($errors->any())
    <ul>{!! implode('', $errors->all('<li style="color:red">:message</li>')) !!}</ul>
@endif

۵-نتیجه کار چیزی شبیه فرم زیر می‌شود:

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

 چطور پیام خطای اعتبارسنجی را سفارشی سازی کنیم؟

در ادامه، تصور کنید که شما می‌خواهید به جای پیام “The name field is required” پیام خطای شخصی سازی شده خود را نمایش دهید یا بخواهید این پیام را به زبان‌های دیگر ترجمه کنید، چطور در لاراول این کار را باید انجام دهیم؟

ویژگی خوب لاراول در این قسمت این است که شما نیازی به تغییر هیچ چیز در کنترلر یا در درخواست‌های خود و به طور کل هیچ چیزی در پوشه app خود ندارید. همه پیام‌های سفارشی شده از قبل در فایل resources/lang/en/validation.php به صورت جدا از هم تفکیک شده‌اند، همچنین شما می‌توانید پوشه زبان مورد نظر خود را مانند پوشه /en/  که به صورت پیش‌فرض وجود دارد، ایجاد کنید.

 در زیر پیام‌هایی که به صورت پیش‌فرض در این فایل قرار دارد را می‌بینیم:

return [

    /*
    |--------------------------------------------------------------------------
    | Validation Language Lines
    |--------------------------------------------------------------------------
    |
    | The following language lines contain the default error messages used by
    | the validator class. Some of these rules have multiple versions such
    | as the size rules. Feel free to tweak each of these messages here.
    |
    */

    'accepted'             => 'The :attribute must be accepted.',
    'active_url'           => 'The :attribute is not a valid URL.',
    'after'                => 'The :attribute must be a date after :date.',
    'alpha'                => 'The :attribute may only contain letters.',
    'alpha_dash'           => 'The :attribute may only contain letters, numbers, and dashes.',
    'alpha_num'            => 'The :attribute may only contain letters and numbers.',
    'array'                => 'The :attribute must be an array.',
    'before'               => 'The :attribute must be a date before :date.',
    'between'              => [
        'numeric' => 'The :attribute must be between :min and :max.',
        'file'    => 'The :attribute must be between :min and :max kilobytes.',
        'string'  => 'The :attribute must be between :min and :max characters.',
        'array'   => 'The :attribute must have between :min and :max items.',
    ],
    'boolean'              => 'The :attribute field must be true or false.',
    'confirmed'            => 'The :attribute confirmation does not match.',
    'date'                 => 'The :attribute is not a valid date.',
    'date_format'          => 'The :attribute does not match the format :format.',
    'different'            => 'The :attribute and :other must be different.',
    'digits'               => 'The :attribute must be :digits digits.',
    'digits_between'       => 'The :attribute must be between :min and :max digits.',
    'email'                => 'The :attribute must be a valid email address.',
    'filled'               => 'The :attribute field is required.',
    'exists'               => 'The selected :attribute is invalid.',
    'image'                => 'The :attribute must be an image.',
    'in'                   => 'The selected :attribute is invalid.',
    'integer'              => 'The :attribute must be an integer.',
    'ip'                   => 'The :attribute must be a valid IP address.',
    'max'                  => [
        'numeric' => 'The :attribute may not be greater than :max.',
        'file'    => 'The :attribute may not be greater than :max kilobytes.',
        'string'  => 'The :attribute may not be greater than :max characters.',
        'array'   => 'The :attribute may not have more than :max items.',
    ],
    'mimes'                => 'The :attribute must be a file of type: :values.',
    'min'                  => [
        'numeric' => 'The :attribute must be at least :min.',
        'file'    => 'The :attribute must be at least :min kilobytes.',
        'string'  => 'The :attribute must be at least :min characters.',
        'array'   => 'The :attribute must have at least :min items.',
    ],
    'not_in'               => 'The selected :attribute is invalid.',
    'numeric'              => 'The :attribute must be a number.',
    'regex'                => 'The :attribute format is invalid.',
    'required'             => 'The :attribute field is required.',
    'required_if'          => 'The :attribute field is required when :other is :value.',
    'required_with'        => 'The :attribute field is required when :values is present.',
    'required_with_all'    => 'The :attribute field is required when :values is present.',
    'required_without'     => 'The :attribute field is required when :values is not present.',
    'required_without_all' => 'The :attribute field is required when none of :values are present.',
    'same'                 => 'The :attribute and :other must match.',
    'size'                 => [
        'numeric' => 'The :attribute must be :size.',
        'file'    => 'The :attribute must be :size kilobytes.',
        'string'  => 'The :attribute must be :size characters.',
        'array'   => 'The :attribute must contain :size items.',
    ],
    'timezone'             => 'The :attribute must be a valid zone.',
    'unique'               => 'The :attribute has already been taken.',
    'url'                  => 'The :attribute format is invalid.',

    /*
    |--------------------------------------------------------------------------
    | Custom Validation Language Lines
    |--------------------------------------------------------------------------
    |
    | Here you may specify custom validation messages for attributes using the
    | convention "attribute.rule" to name the lines. This makes it quick to
    | specify a specific custom language line for a given attribute rule.
    |
    */

    'custom' => [
        'attribute-name' => [
            'rule-name' => 'custom-message',
        ],
    ],

    /*
    |--------------------------------------------------------------------------
    | 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' => [],

];

در اصل، این فایل از یک آرایه چند بعدی شامل متن‌های مختلف تشکیل شده است. در این آرایه برخی متغیرها مانند :attribute, :min, :max, :size دارای پیشوند : هستند. بنابراین نحوه کار این فایل به صورت زیر است:

الف) پس از بروز خطا در اعتبارسنجی، لاراول قانونی (rule) که در کلاس درخواست خود تعریف کرده‌ایم و دچار خطا شده است را در این فایل جستجو می‌کند مانند: قانون 'required'

ب)ما این قانون را در آرایه اصلی پیدا کردیم:

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

 ج)لاراول متغیر :attribute را با نام فیلد ما جایگزین می‌کند و نتیجه را به صورت یک رشته باز می‌گرداند.

 یک بار دیگر- نتیجه چیزی مشابه زیر است:

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

در ادامه به پرسش اصلی مقاله خود می‌پردازیم، اگر بخواهیم پیام‌های خطا را سفارشی سازی کنیم ما چند گزینه پیش رو داریم:

گزینه اول) تغییر متن خطای قانون

 شما می‌توانید به سادگی متن ' The :attribute field is required.' را به هر چیز دیگری که می‌خواهید تغییر دهید و سپس متن جدید در صورت بروز خطا برای هر فیلدی که از این قانون استفاده می‌کند نمایش داده می‌شود.

// ...
    'required' => 'Please enter your :attribute.',
// ...

گزینه دوم) مشخص کردن فیلد و قانون به همراه متن ارور 

اگر به فایل بالا توجه کنید آرایه custom را در پایین آن خواهید دید. در این آرایه شما می‌توانید فیلدهای مورد نظر خود را به همراه قانون و متن خطایی که می‌خواهید در صورت بروز خطا نمایش داده شود را اضافه کنید.

// ...
    'custom' => [
        'name' => [
            'required' => 'Please enter your first name',
        ],
    ],
// ...

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

 گزینه آخر) ترجمه به زبانی دیگر

من پیش‌تر به طور خلاصه اشاره کردم که شما می‌توانید زبان مورد نظر خود را استفاده کنید. برای این کار دقیقا مشابه پوشه /en/ ، به پوشه‌ی /resources/lang/ رفته و پوشه زبان مورد نظر خود را ایجاد می‌کنیم مانند پوشه /fa/ و سپس فایل‌های که برای ترجمه می‌خواهیم استفاده کنیم را قرار می‌دهیم مانند فایل validation.php . تنها بخش دشوار این کار چگونگی تعریف کردن زبان جدید است. برای این کار به فایل config/app.php می‌رویم:

	/*
    |--------------------------------------------------------------------------
    | Application Locale Configuration
    |--------------------------------------------------------------------------
    |
    | The application locale determines the default locale that will be used
    | by the translation service provider. You are free to set this value
    | to any of the locales which will be supported by the application.
    |
    */

    'locale' => 'en',
    // ...

در این فایل اگر شما می‌خواهید که زبان پیش‌فرض سیستم خود را تغییر دهید، locale را روی زبان مورد نظر خود تنظیم می‌کنید مانند fa و... . همچنین اگر می‌خواهید زبان فعال اپلیکیشن را مطابق با URL تغییر دهید(به عنوان مثال اگر شما URL به صورت website.com/fr/some_page دارید) و یا متغیر های session  (مانند تنظیمات ویژه‌ی بازدیدکننده) شما می‌توانید این موارد را با استفاده از کد زیر تغییر دهید:

app()->setLocale('fr');

یا

app()->setLocale(Session::get('locale'));

به همین ترتیب شما با موارد ذکر شده مطمئن خواهید شد که کاربران وبسایت شما پیام‌های خطا سفارشی شده و قابل فهم‌تری را مشاهده خواهند کرد.

منبع

دیدگاه‌ها و پرسش‌ها

برای ارسال نظر لازم است ابتدا وارد سایت شوید
در حال دریافت نظرات از سرور، لطفا منتظر بمانید