فصل ۱۳-۳: سایر مباحث مرتبط با اعتبارسنجی در لاراول

16 فروردین 1396
درسنامه درس 21 از سری لاراول
Laravel-Main-custom-validation-

با مطالعه‌ی دو فصل ۱۳-۱ و ۱۳-۲ به نحوه‌ی کار با اعتبارسنجی و قوانین آن در لاراول آشنا شدید. حال در این بخش به توضیح دقیق‌تر مبحث اعتبارسنجی می‌پردازیم و مطالب پیشرفته‌تری را خدمت شما عزیزان ارائه خواهیم داد. با ما همراه باشید.

اضافه کردن قوانین شرطی

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

ممکن است در برخی مواقع اعتبارسنجی را به گونه‌ای بکار ببرید که اگر فیلد موردنظر در بین اطلاعات ورودی باشد. برای اعمال این شرط یک قانون به نام sometimes اضافه خواهیم کرد:

$v = Validator::make($data, [
    'email' => 'sometimes|required|email',
]);

در این فیلد email مورد اعتبارسنجی قرار می‌گیرد اگر و فقط اگر درون آرایه‌ی داده‌ای data$ وجود داشته باشد.

اعتبارسنجی‌ شرطی پیچیده‌تر

برخی مواقع نیاز است که یک قانون اعتبارسنجی را بر اساس شروط منطقی پیچیده‌تر طراحی و اجرا کرد. برای مثال فرض کنید میخواهیم یک فیلد موردنظر را required درنظر بگیرید اگر و فقط اگر فیلد دیگری مقداری بیش از ۱۰۰ را داشته باشد. یا برای درک بهتر یک مثال دیگر می‌زنیم: فرض کنید دو فیلد دارید و می‌خواهید یک فیلد زمانی required شود که فیلد دیگری دارای مقدار باشد و یا اصلا وجود داشته باشد. برای اضافه کردن اضافه کردن این قوانین شرطی خیلی سخت نیست! به نمونه‌ی زیر توجه کنید که در آن ابتدا یک نمونه‌ی Validator با قوانین ثابت ایجاد کرده که هیچ تغییری نمی‌کنند:

$v = Validator::make($data, [
    'email' => 'required|email',
    'games' => 'required|numeric',
]);

حال فرض کنید شما یک فروشگاه اینترنتی بازی ایجاد کرده‌اید. حال کاربر می‌خواهد یک بازی را خریداری کند و شما می‌خواهید در صورتیکه کاربر فیلد مقایسه بازی را انتخاب کرد همواره بررسی شود که تعداد بازی های انتخابی کمتر از ۳ عدد نباشد. در اینصورت باید از اعتبارسنجی‌های شرطی با استفاده از متد sometimes استفاده کرد. یعنی وقتی که شرط برقرار بود اعتبارسنجی اعمال شود:

$v->sometimes('compair_it', 'required|max:5', function ($input) {
    return $input->games >= 3;
});

در متد sometimes سه آرگومان وجود دارد که آرگومان اول برابر نام فیلد موردنظر می‌باشد که شرط روی آن قرار گرفته است. آرگومان دوم برابر قوانین پایه‌ای که می‌خواهیم به آن فیلد اضافه شود و آرگومان سوم اگر مقدار true را باز گرداند به سایر قوانین اضافه خواهد شد. همچنین می‌توان فیلدهای دیگری را برای بررسی شرط اضافه کرد:

$v->sometimes(['reason', 'cost'], 'required', function ($input) {
    return $input->games >= 3;
});

توجه: متغییر input$ که به عنوان ورودی به تابع Clouser شما ارسال شده است یک نمونه از Illuminate\Support\Fluent می‌باشد که برای دسترسی به داده‌های ورودی و فایل‌ها استفاده می‌شود. 

اعتبارسنجی آرایه‌ها

اعتبارسنجی فیلدهایی که به صورت آرایه تعریف می‌شوند بسیار ساده است. برای مثال در نظر بگیرید که می‌خواهیم هر ایمیل موجود در آرایه‌ی فیلد ورودی همواره Unique باشد. برای اینکار کافیست به صورت زیر عمل کنیم:

$validator = Validator::make($request->all(), [
    'person.*.email' => 'email|unique:users',
    'person.*.first_name' => 'required_with:person.*.last_name',
]);

توجه دارید که از علامت * (ستاره) هنگامی استفاده می‌شود که پیام‌‌های اعتبارسنجی شما برای زبان خاصی طراحی شده باشد در این صورت داریم:

'custom' => [
    'person.*.email' => [
        'unique' => 'Each person must have a unique e-mail address',
    ]
],

قوانین اعتبارسنجی شخصی

گاهی ممکن است بخواهیم قوانین شخصی‌ای برای اعتبارسنجی ایجاد کنیم که با استفاده از آن بتوانیم هر فیلد ورودی را با قانونی که ما تعیین کرده‌ایم بررسی کنیم. برای این کار لاراول ابزار بسیار مفیدی را در اختیار شما قرار می‌دهد. یکی از روش‌ها، ایجاد کردن قوانین اعتبارسنجی دلخواه توسط متد extend در Validator Facade‌ است. اجازه دهید از این روش درون یک Service Provider برای ثبت یک قانون جدید استفاده کنیم:

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Validator;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        Validator::extend('foo', function ($attribute, $value, $parameters, $validator) {
            return $value == 'foo';
        });
    }

    /**
     * Register the service provider.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

همانطور که ملاحظه می‌کنید، شخصی‌سازی قوانین اعتبارسنجی با یک Clouser‌ همراه است که ۴ آرگومان دریافت می‌کند:‌ نام و صفت فیلد که در attribute$ قرار می‌گیرد، مقدار هر صفت که در value$ درج می‌شود، آرایه‌ای از پارامترهای ارسالی به قوانین که در parameters$ درج خواهد شد و در نهایت یک نمونه‌ی Validator. همچنین می‌توان یک کلاس را به عنوان ورودی به متد extend به جای Clouser ارسال کرد:

Validator::extend('foo', 'FooValidator@validate');

تعریف کردن پیام خطاها

همچنین گاها نیاز است که شما برای قوانین دلخواه خود پیام‌های خطایی متناسب با آن را ارسال کنید. برای این کار باید همواره از متد replacer در Validator Facade استفاده کرد و آن را فراخوانی نمود. این کار را می‌توانید درون متد boot یکی از Service Providerها انجام دهید:

/**
 * Bootstrap any application services.
 *
 * @return void
 */
public function boot()
{
    Validator::extend(...);

    Validator::replacer('foo', function ($message, $attribute, $rule, $parameters) {
        return str_replace(...);
    });
}

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

تمام فصل‌های سری ترتیبی که روکسو برای مطالعه‌ی دروس سری لاراول توصیه می‌کند:
نویسنده شوید

دیدگاه‌های شما (1 دیدگاه)

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

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

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

روکسو
25 مرداد 1396
با سلام برای انجام اینکار باید اطلاعات ورودی و دریافتی رو با استفاده از توابع مرتبط با رشته ها در زبان PHP فیلتر کنید. یا می‌توانید از عبارات با قاعده یا Regular Expression بهره ببرید.

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