برنامه نویس و مهندس نرم افزار

validation در لاراول

يكشنبه, ۲۰ بهمن ۱۳۹۸، ۰۷:۴۷ ب.ظ


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

تعریف مسیرها:

ابتدا فرض کنیم مسیرهای زیر را در پرونده خود تعریف کرده ایم:

Route::get('post/create', 'PostController@create');

Route::post('post', 'PostController@store');

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

 

ایجاد کنترلر
بعد ، بیایید نگاهی بیندازیم به یک کنترلر ساده که این مسیرها را کنترل می کند. اکنون روش 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...
    }
}

 نوشتن منطق اعتبار سنجی
اکنون ما آماده هستیم تا روش STORE خود را با این منطق برای اعتبارسنجی پست وبلاگ جدید پر کنیم. برای این کار از روشی معتبر تهیه شده توسط شی Illuminate \ Http \ Request استفاده خواهیم کرد. اگر قوانین اعتبارسنجی تصویب شوند ، کد شما اجرای خود را به صورت عادی ادامه می دهد. اما اگر اعتبار سنجی انجام نشود ، یک استثناء انداخته می شود و پاسخ خطایی مناسب به طور خودکار به کاربر ارسال می شود. در صورت درخواست سنتی HTTP ، یک پاسخ تغییر مسیر ایجاد می شود ، در حالی که یک پاسخ JSON برای درخواست های 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 منتقل می کنیم. باز هم ، اگر اعتبار سنجی انجام نشود ، پاسخ مناسب به طور خودکار ایجاد می شود. اگر اعتبار سنجی بگذرد ، کنترلر ما به طور معمول اجرای خود را ادامه می دهد.

از طرف دیگر ، قوانین اعتبارسنجی ممکن است به جای یک تک به عنوان آرایه ای از قوانین مشخص شوند | رشته نامحدود:

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

اگر مایل هستید ERROR BAG را که پیام های خطا در آن قرار داده شده است ، مشخص کنید ، می توانید از روش validateWithBag استفاده کنید:

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

متوقف کردن اولین عدم موفقیت اعتبارسنجی:
بعضی اوقات ممکن است بخواهید بعد از اولین خرابی اعتبار ، اجرای قوانین اعتبارسنجی را روی یک ویژگی متوقف کنید. برای این کار ، قانون BAIL را به این ویژگی اختصاص دهید:

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

در این مثال ، اگر قانون UNIQUE روی ویژگی TITLE خراب شود ، قانون MAX بررسی نمی شود. قوانین به ترتیبی که تعیین شده اند معتبر خواهند بود.

یادداشت در مورد ویژگی های تو در تو
اگر درخواست HTTP شما حاوی پارامترهای "تو در تو" است ، می توانید آنها را در قوانین اعتبار خود با استفاده از نحو "نقطه" مشخص کنید:

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

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

باز هم توجه کنید که ما در مسیر GET خود مجبور نبودیم پیغامهای خطا را به طور صریح به نمایش پیوند دهیم. این امر به این دلیل است که Laravel خطاهای موجود در داده های جلسه را بررسی می کند و در صورت موجود بودن آنها را به طور خودکار به نمایش متصل می کند. متغیر $ ERROR نمونه ای از Illuminate \ Support \ MessageBag خواهد بود.

متغیر ERROR$ توسط واسطه بین المللی Illuminate \ View \ Middleware \ ShareErrorsFromSession ، که توسط گروه وب MIDDLEWARE تهیه شده است ، به نمای محدود می شود. هنگامی که این میان افزار اعمال می شود ، یک متغیر ERROR$ همیشه در دیدگاه های شما موجود می باشد ، به شما امکان می دهد فرض کنید متغیر ERROR$ به راحتی همیشه تعریف شده است و می توانید با خیال راحت از آن استفاده کنید.

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

<!-- /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 -->

یادداشت در زمینه های اختیاری
به طور پیش فرض ، Laravel شامل واسط TrimStrings و ConvertEmptyStringsToNull در پشته جهانی برنامه جهانی برنامه شما است. این وسایل واسط طبق برنامه App \ Http \ Kernel در پشته ذکر شده اند. به همین دلیل ، اگر نمی خواهید اعتبارگر مقادیر NULL را نامعتبر در نظر بگیرد ، اغلب باید زمینه های درخواست "اختیاری" خود را به عنوان NULLABLE علامت گذاری کنید. مثلا:

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

در این مثال ، ما مشخص می کنیم که قسمت bot_at ممکن است NULL یا یک تاریخ معتبر باشد. اگر اصلاح کننده NULLABLE به تعریف قانون اضافه نشود ، اعتبار دهنده NULL را یک تاریخ نامعتبر می داند.

 

درخواستها و اعتبار سنجی AJAX:
در این مثال ، ما برای ارسال داده به برنامه از یک فرم سنتی استفاده کردیم. با این حال ، بسیاری از برنامه ها از درخواست های AJAX استفاده می کنند. هنگام استفاده از روش VALIDATE در طی درخواست AJAX ، Laravel پاسخی برای تغییر مسیر ایجاد نمی کند. در عوض ، Laravel یک پاسخ JSON تولید می کند که حاوی همه خطاهای اعتبارسنجی است. این پاسخ JSON با کد وضعیت 422 HTTP ارسال می شود.

 

اعتبار درخواست فرم

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

برای سناریوهای اعتبار سنجی پیچیده تری ، ممکن است بخواهید "درخواست فرم" ایجاد کنید. درخواست فرم ها کلاس های درخواست سفارشی هستند که حاوی منطق اعتبار سنجی هستند. برای ایجاد یک کلاس درخواست فرم ، از دستور artisan CLI استفاده کنید :make:request

php artisan make:request StoreBlogPost

کلاس تولید شده در فهرست قرار می گیرد اگر این فهرست وجود نداشته باشد ، هنگام اجرای دستور ، ایجاد می شود بیایید چند قانون اعتبار سنجی را به روش اضافه کنیم:app/Http/Requestsmake:requestrules

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

شما می توانید وابستگی های مورد نیاز خود را در rulesامضای روش تایپ کنید آنها بطور خودکار از طریق ظرف سرویس Laravel برطرف می شوند .

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

/**
 * Store the incoming blog post.
 *
 * @param  StoreBlogPost  $request
 * @return Response
 */
public function store(StoreBlogPost $request)
{
    // The incoming request is valid...

    // Retrieve the validated input data...
    $validated = $request->validated();
}

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

افزودن قلاب پس از شکل دادن به درخواست ها

اگر می خواهید قلاب "بعد" را به درخواست فرم اضافه کنید ، می توانید از این withValidatorروش استفاده کنید. این روش اعتبار سنجی کاملاً ساخته شده را دریافت می کند و به شما امکان می دهد قبل از ارزیابی قوانین اعتبارسنجی ، هرکدام از روشهای آن را فراخوانی کنید:

/**
 * Configure the validator instance.
 *
 * @param  \Illuminate\Validation\Validator  $validator
 * @return void
 */
public function withValidator($validator)
{
    $validator->after(function ($validator) {
        if ($this->somethingElseIsInvalid()) {
            $validator->errors()->add('field', 'Something is wrong with this field!');
        }
    });
}

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

کلاس درخواست فرم همچنین شامل authorizeروشی است. در این روش ، شما می توانید بررسی کنید که آیا کاربر معتبر در واقع صلاحیت به روزرسانی یک منبع داده شده را دارد یا خیر. به عنوان مثال ، شما ممکن است تعیین کنید که آیا کاربر در واقع صاحب نظر وبلاگی است که در تلاش است تا آن را به روز کند:

/**
 * Determine if the user is authorized to make this request.
 *
 * @return bool
 */
public function authorize()
{
    $comment = Comment::find($this->route('comment'));

    return $comment && $this->user()->can('update', $comment);
}

از آنجا که کلیه درخواست های فرم ، کلاس درخواست اصلی Laravel را گسترش می دهد ، ما ممکن است از این userروش برای دسترسی به کاربر معتبر فعلی استفاده کنیم. همچنین routeدر مثال بالا تماس با روش را یادداشت کنید این روش به شما امکان دسترسی به پارامترهای URI تعریف شده در مسیری که گفته می شود ، مانند پارامتر موجود در مثال زیر می دهد:{comment}

Route::post('comment/{comment}');

اگر این authorizeروش بازگردد false، یک پاسخ HTTP با کد وضعیت 403 بطور خودکار برمی گردد و روش کنترل کننده شما اجرا نمی شود.

اگر می خواهید در قسمت دیگری از برنامه خود منطق مجوز داشته باشید ، trueاز authorizeروش برگردید :

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

شما می توانید وابستگی های مورد نیاز خود را در authorizeامضای روش تایپ کنید آنها بطور خودکار از طریق ظرف سرویس Laravel برطرف می شوند .

شخصی سازی پیام های خطا

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

/**
 * Get the error messages for the defined validation rules.
 *
 * @return array
 */
public function messages()
{
    return [
        'title.required' => 'A title is required',
        'body.required'  => 'A message is required',
    ];
}

شخصی سازی ویژگی های اعتبار سنجی

اگر دوست دارید :attributeقسمتی از پیام اعتبارسنجی شما با نام ویژگی سفارشی جایگزین شود ، می توانید با غلبه بر attributesروش ، نامهای دلخواه را مشخص کنید این روش باید مجموعه ای از جفت های ویژگی / نام را برگرداند:

/**
 * Get custom attributes for validator errors.
 *
 * @return array
 */
public function attributes()
{
    return [
        'email' => 'email address',
    ];
}

ورودی را برای اعتبار سنجی آماده کنید

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

use Illuminate\Support\Str;

/**
 * Prepare the data for validation.
 *
 * @return void
 */
protected function prepareForValidation()
{
    $this->merge([
        'slug' => Str::slug($this->slug),
    ]);
}

ایجاد اعتبار سنجی دستی

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

<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;

class PostController extends Controller
{
    /**
     * Store a new blog post.
     *
     * @param  Request  $request
     * @return Response
     */
    public function store(Request $request)
    {
        $validator = Validator::make($request->all(), [
            'title' => 'required|unique:posts|max:255',
            'body' => 'required',
        ]);

        if ($validator->fails()) {
            return redirect('post/create')
                        ->withErrors($validator)
                        ->withInput();
        }

        // Store the blog post...
    }
}

اولین آرگومان منتقل شده به makeروش ، داده های مورد تأیید است. استدلال دوم قوانین اعتبار سنجی است که باید برای داده ها اعمال شود.

پس از بررسی عدم اعتبار سنجی درخواست ، می توانید از این withErrorsروش برای فلش کردن پیام های خطا به جلسه استفاده کنید. هنگام استفاده از این روش ، $errorsمتغیر پس از تغییر مسیر به طور خودکار با نظرات شما به اشتراک گذاشته می شود و به شما امکان می دهد تا به راحتی آنها را به کاربر نمایش دهید. این withErrorsروش یک اعتبار سنج ، a MessageBagیا یک PHP را می پذیرد array.

تغییر مسیر خودکار

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

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

کیف های خطا نامگذاری شده است

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

return redirect('register')
            ->withErrors($validator, 'login');

سپس می توانید به MessageBagعنوان مشخص شده از $errorsمتغیر دسترسی پیدا کنید :

{{ $errors->login->first('email') }}

بعد از هوک اعتبار سنجی

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

$validator = Validator::make(...);

$validator->after(function ($validator) {
    if ($this->somethingElseIsInvalid()) {
        $validator->errors()->add('field', 'Something is wrong with this field!');
    }
});

if ($validator->fails()) {
    //
}

کار با پیام های خطا

پس از فراخوانی این errorsروش به طور Validatorمثال ، نمونه ای دریافت می کنید که دارای روش های متنوعی برای کار با پیام های خطا است. متغیر است که به طور خودکار در دسترس همه دیدگاه ها ساخته شده است یک نمونه از کلاس.Illuminate\Support\MessageBag$errorsMessageBag

بازیابی اولین پیام خطا برای یک زمینه

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

$errors = $validator->errors();

echo $errors->first('email');

بازیابی تمام پیام های خطا برای یک زمینه

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

foreach ($errors->get('email') as $message) {
    //
}

اگر شما به اعتبار یک میدان فرم آرایه، شما ممکن است تمام پیام برای هر یک از عناصر آرایه با استفاده از بازیابی *شخصیت:

foreach ($errors->get('attachments.*') as $message) {
    //
}

بازیابی تمام پیام های خطا برای همه زمینه ها

برای بازیابی آرایه ای از همه پیام ها برای همه زمینه ها ، از allروش استفاده کنید:

foreach ($errors->all() as $message) {
    //
}

تعیین اگر پیام ها برای یک زمینه وجود دارند

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

if ($errors->has('email')) {
    //
}

پیام های خطای سفارشی

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

$messages = [
    'required' => 'The :attribute field is required.',
];

$validator = Validator::make($input, $rules, $messages);

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

$messages = [
    'same'    => 'The :attribute and :other must match.',
    'size'    => 'The :attribute must be exactly :size.',
    'between' => 'The :attribute value :input is not between :min - :max.',
    'in'      => 'The :attribute must be one of the following types: :values',
];

تعیین پیام سفارشی برای یک ویژگی خاص

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

$messages = [
    'email.required' => 'We need to know your e-mail address!',
];

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

در بیشتر موارد ، احتمالاً به جای انتقال مستقیم آنها به آن ، پیامهای سفارشی خود را در یک فایل زبانی مشخص خواهید کرد Validatorبرای این کار ، پیام های خود را برای customآرایه در پرونده زبان اضافه کنید.resources/lang/xx/validation.php

'custom' => [
    'email' => [
        'required' => 'We need to know your e-mail address!',
    ],
],

مشخص کردن ویژگی های سفارشی در پرونده های زبان

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

'attributes' => [
    'email' => 'email address',
],

تعیین مقادیر سفارشی در پرونده های زبان

بعضی اوقات ممکن است لازم باشد :valueبخشی از پیام اعتبارسنجی شما با یک نمایش دلخواه از مقدار جایگزین شود. به عنوان مثال ، این قانون زیر را در نظر بگیرید که مشخص می کند در صورت payment_typeداشتن مقدار کارت اعتباری لازم است cc:

$request->validate([
    'credit_card_number' => 'required_if:payment_type,cc'
]);

در صورت عدم موفقیت این قانون ، پیام خطای زیر را تولید می کند:

The credit card number field is required when payment type is cc.

به جای نمایش ccبه عنوان مقدار نوع پرداخت ، می توانید validationبا تعیین یک valuesآرایه ، یک مقدار ارزش دلخواه را در پرونده زبان خود تعیین کنید:

'values' => [
    'payment_type' => [
        'cc' => 'credit card'
    ],
],

در صورت عدم موفقیت اعتبار ، پیام زیر را تولید می کند:

The credit card number field is required when payment type is credit card.

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

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

 

 

 

 

 

 

 

  • حامد طاهری

نظرات  (۰)

هیچ نظری هنوز ثبت نشده است
ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی