Trong quá trình phát triển website Laravel, mình cảm thấy hệ thống Validation của Laravel rất tuyệt vời, nó cung cấp đã cung cấp cho chúng ta một bộ quy tắc kiểm tra dữ liệu, mà trong các trường hợp bình thường đã đủ để kiểm tra các loại dữ liệu khác nhau.

Điểm tốt nhất của framework không chỉ cung cấp cho chúng ta các bộ quy tắc kiểm tra dữ liệu đã tích hợp sẵn trong hệ thống, mà còn cho phép chúng chúng ta xây dựng và mở rộng các bộ quy tắc cho riêng chúng ta, giúp chúng ta có thể sử dụng trong các dự án khác nhau.

Trong bài viết này, chúng ta sẽ khám phá cách tạo ra một Custom Validation Rule.

Giả sử, chúng ta muốn tạo ra một Validation Rule là kiểm tra độ tuổi của người dùng có phù hợp để đăng kí tài khoản ở website của chúng ta hay không?

Đầu tiên, chúng ta sẽ tạo Validation Rule có tên là  AdultAge, bằng lệnh command sau đây:

php artisan make:rule AdultAge

Sau khi lệnh command trên chạy xong, nó sẽ tạo ra một file mới có tên là AdultAge.php nằm ở thư mục app/Rules

<?php

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;

class AdultAge implements Rule
{
    /**
     * Create a new rule instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Determine if the validation rule passes.
     *
     * @param  string  $attribute
     * @param  mixed  $value
     * @return bool
     */
    public function passes($attribute, $value)
    {
        //
    }

    /**
     * Get the validation error message.
     *
     * @return string
     */
    public function message()
    {
        return 'The validation error message.';
    }
}

Thường chúng ta tạo ra một rule thì sẽ có 3 hàm mặc định:

1. __construct() Nơi cho chúng ta truyền các giá trị khởi tạo rule.
2. passes() Nơi cho chúng ta xây dựng các logic để kiểm tra dữ liệu, biến $attribute chính là tên field còn $value là giá trị của field.
3. message() Nơi cho chúng ta tùy chỉnh câu thông báo lỗi khi dữ liệu người dùng nhập vào không hợp lệ.

Sau khi chúng ta đã hiểu được mục đích của các hàm trên, chúng ta hãy tiếp tục xử lý các logic để kiểm tra dữ liệu, bạn hãy mở file AdultAge.php và chỉnh sửa như sau:

<?php

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;

class AdultAge implements Rule
{
    /**
     * Create a new rule instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Determine if the validation rule passes.
     *
     * @param  string  $attribute
     * @param  mixed  $value
     * @return bool
     */
    public function passes($attribute, $value)
    {
        if (is_numeric($value)) {
            return $value >= 20 && $value <= 59;
        } 
        return false;
    }

    /**
     * Get the validation error message.
     *
     * @return string
     */
    public function message()
    {
        return 'Độ tuổi của bạn không phù hợp với website của chúng tôi.';
    }
}

Để sử dụng được rule mà chúng ta tạo ở trên thì có 3 cách để sử dụng:

Cách 1: Sử dụng validate trực tiếp vào hàm store hoặc update ở controller

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Rules\AdultAge;

class PostController extends Controller
{
    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        $validated = $request->validate([
            'age' => ['required', new AdultAge()]
        ]);
    }
}

Cách 2: Sử dụng trong class request, ở đây mình sẽ sử dụng class request có tên là StorePostRequest

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use App\Rules\AdultAge;

class StorePostRequest extends FormRequest
{
    /**
     * 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 [
            'age' => ['required', new AdultAge()]
        ];
    }
}

Cách 3: Thêm Rule vào AppServiceProvider

Bạn có thể Rule vào AppServiceProvider ở hàm boot. Bạn có thể đặt tên tùy ý cho rule của mình, ở đây, mình sẽ đặt tên rule là adult_age

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Validator;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        Validator::extend('adult_age', function ($attribute, $value, $parameters) {
            return (new \App\Rules\AdultAge())->passes($attribute, $value);
       });
    }
}

Sau khi thêm vào AppServiceProvider, bạn hãy sử dụng rule như sau:

+ Sử dụng validate trực tiếp vào hàm store hoặc update ở controller

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class PostController extends Controller
{
    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        $validated = $request->validate([
           'age' => 'required|adult_age'
        ]);
    }
}

+ Sử dụng trong class request, ở đây mình sẽ sử dụng class request có tên là StorePostRequest

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class StorePostRequest extends FormRequest
{
    /**
     * 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 [
            'age' => 'required|adult_age'
        ];
    }
}

Lưu ý: Khi sử dụng rule ở AppServiceProvider thì hàm message() của rule không hoạt động, bạn phải chỉnh sửa câu thông báo ở hàm messages() trong class request hoặc ở validation.php nằm trong thư mục resources\lang\{language}.

Về lưu ý này thì mình không chắc chắn 100%, nếu bạn nào cách sử dụng hàm message() khi rule được  khai báo AppServiceProvider thì hãy liên hệ với mình qua trang contact, để mình cập nhật lại bài viết này nhé!

Tôi hy vọng bạn thích hướng dẫn này. Nếu bạn có bất kỳ câu hỏi nào hãy liên hệ với chúng tôi qua trang contact. Cảm ơn bạn.

CÓ THỂ BẠN QUAN TÂM

Cloudflare's Turnstile CAPTCHA in Laravel

Cloudflare's Turnstile CAPTCHA in Laravel

Ngày 28/09/2022, Cloudflare đã thông báo về phiên bản beta mở của Turnstile, một giải pháp thay thế vô hình cho CAPTCHA. Bất kỳ ai, ở bất kỳ đâu trên Internet muốn thay thế CAPTCHA trên trang web c...

Defer in Laravel: Push Tasks to the Background

Defer in Laravel: Push Tasks to the Background

Deferred Functions trong Laravel Các phiên bản Laravel trước version 11, chúng ta thường sử dụng Queued Jobs cho phép thực hiện sắp xếp các tác vụ xử lý background . Nhưng đôi khi có những tác v...

Laravel One to One Eloquent Relationship

Laravel One to One Eloquent Relationship

Mối quan hệ một-một là một mối quan hệ rất cơ bản. Trong hướng dẫn này, tôi sẽ hướng dẫn bạn cách tạo dữ liệu và truy xuất dữ liệu bằng Eloquent Model. Trong hướng dẫn này, tôi sẽ tạo hai bảng là u...

Export CSV from SQL Server - Import into MySQL with Laravel

Export CSV from SQL Server - Import into MySQL with Laravel

Transfer Database Trong quá trình phát triển và bảo trì dự án, việc di chuyển cơ sở dữ liệu từ hệ thống này sang hệ thống khác là một nhiệm vụ khá phổ biến. Giả sử bạn cần di chuyển dữ liệu từ SQ...

Laravel Controllers

Laravel Controllers

Trong mô hình MVC, chữ "C" là từ viết tắt của Controller và nó đóng vai trò rất quan trọng để phân tích các logic business. Khi người dùng truy cập vào trình duyệt, nó sẽ đi đến route đầu tiên, sau đó...

Export CSV from AWS RDS - Import into MySQL with Laravel

Export CSV from AWS RDS - Import into MySQL with Laravel

Transfer Database Trong quá trình phát triển và bảo trì dự án, nhiệm vụ di chuyển cơ sở dữ liệu từ hệ thống này sang hệ thống khác là một nhiệm vụ khá là phổ biến. Chúng ta thường sẽ sử dụng câu...

Fast Paginate in Laravel

Fast Paginate in Laravel

Laravel Fast Paginate là gì? Laravel Fast Paginate là một macro nhanh về phân trang offset/limit cho Laravel. Nó được sử dụng để thay thể paginate trong Laravel.Package này sử dụng phương pháp SQL t...

Laravel Model

Laravel Model

Model là gì? Trong mô hình MVC, chữ “M” viết tắt là Model, Model dùng để xử lý logic nghiệp vụ trong bất kì ứng dụng dựa trên mô hình MVC. Trong Laravel, Model là lớp đại diện cho cấu trúc logic và...

Amazon S3 Pre-Signed URL with DropzoneJs in Laravel

Amazon S3 Pre-Signed URL with DropzoneJs in Laravel

Chức năng upload file hay hình ảnh là một chức năng rất phổ biến, hầu hết các dự án đều có chức năng này. Đa số các nhà phát triển khi thực hiện chức năng upload file, thường sẽ sử dụng cách làm nh...

ManhDanBlogs