Toidicode.com

Toidicode.com

BASIC TO ADVANCE

Bài 20: Validation trong Laravel 8 (Phần 1)

Tiếp tục với series, bài này mình sẽ giới thiệu với mọi người về validation trong Laravel8, một phần không thể thiếu trong các ứng dụng.

1. Giới thiệu về validation trong Laravel.

Laravel cung cấp cho cũng ta nhiều cách để xác thực, kiểm tra dữ liệu. Trong đó cách phổ biến nhất là xác thực các dữ liệu người dùng gửi lên HTTP request.

Trong laravel, validation được support rất mạnh và sử dụng cũng như mở rộng cũng rất dễ dàng.

Bạn có thể sử dụng rất nhiều cách để có thể validate được dữ liệu trong Laravel và ở phạm vi bài viết này mình sẽ giới thiệu với mọi người một số cách phổ biến nhất.

2. Validation sử dụng phương thức validate.

Để validate dữ liệu request gửi lên các bạn có thể sử dụng phương thức validate với cú pháp:

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

Trong đó:

  • $rules là một mảng dữ liệu với key là các input name, value là các rule mà bạn muốn ràng buộc.
  • $customMessage là một mảng dữ liệu chứa các custom message của bạn. Trường này có thể bỏ trống.

VD: Validate input id bắt buộc phải có và phải là kiểu số.

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;

Route::get('store', function (Request $request) {
    $request->validate([
        'id' => 'required|integer'
    ]);
})->name('store');

Ngoài cách ngăn cách giữa các rule bằng ký tự '|' bạn cũng có thể viết dưới dạng sau:

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;

Route::get('store', function (Request $request) {
    $request->validate([
        'id' => ['required', 'integer']
    ]);
})->name('store');

Trong trường hợp validate mà không pass laravel sẽ trả về một response redirect về request trước đó, kèm theo các error message được flash xuống session.

Nếu trong trường hợp bạn cần Laravel response về luôn json error code, bạn cần phải truyền thêm tham số accept header application/json hoặc request của bạn là một XHR request.

3. Validation sử dụng form request.

Laravel cung cấp cho chúng ta thêm một cách để tạo ra các validate nằm ở trong file riêng biệt, chứa các logic phục vụ cho việc validate data và có thể tái sử dụng trong những trường hợp tương tự.

Để tạo ra form request trong Laravel, các bạn sử dụng câu lệnh artisan:

php artisan make:request FormRequestName

Trong đó, FormRequestName là form request bạn muốn tạo.

VD: Mình sẽ tạo ra StoreContactRequest.

php artisan make:request StoreContactRequest

Lúc này Laravel sẽ sinh ra cho các bạn một file nằm trong app/Http/Requests/StoreContactRequest.php. File này sẽ có nội dung như dạng như sau (tùy version):

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

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

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

Trong đó:

Phương thức authorize sẽ quyết định xem người dùng có được thực thi request này hay không. Nếu trả về true thì người dùng được phép và ngược lại.
Phương thức rules sẽ chứa các rule các bạn muốn validate.

VD: Mình sẽ chuyển validate ở ví dụ trên vào form request.

- app/Http/Requests/StoreContactRequest.php

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class StoreContactRequest 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 [
            'id' => ['required', 'integer']
        ];
    }
}

- routes/web.php

use App\Http\Requests\StoreContactRequest;
use Illuminate\Support\Facades\Route;

Route::get('store', function (StoreContactRequest $request) {
    return 'pass';
})->name('store');

Đối với form request bạn cũng có thể custom được error mesage bằng cách trả về message trong phương thức message.

VD: Custom message required cho trường id.

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class StoreContactRequest 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 [
            'id' => ['required', 'integer']
        ];
    }

    public function messages()
    {
        return ['id.required' => 'Trường ID là bắt buộc'];
    }
}

Bạn cũng có thể sửa attribute name trong form request bằng cách sử dụng phương thức attributes.

VD: Sửa attribute "id" thành "contact id"

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

Trong một số trường hợp bạn muốn thực hiện thêm một số logic sau khi validate thực thi bạn có sử dụng phương thức after.

VD:

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class StoreContactRequest 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 [
            'id' => ['required', 'integer']
        ];
    }

    public function messages()
    {
        return ['id.required' => 'Trường ID là bắt buộc'];
    }

    /**
     * Configure the validator instance.
     *
     * @param  \Illuminate\Validation\Validator  $validator
     * @return void
     */
    public function withValidator($validator)
    {
        $validator->after(function ($validator) {
            // logic
        });
    }
}

Tương tự bạn cũng có thể chỉnh sửa input data trước khi thực hiện validate bằng cách sử dụng phương thức prepareForValidation.

VD: Xử lí slug input về dạng đường dẫn trước khi validate.

use Illuminate\Support\Str;

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

4. Validation sử dụng Validator.

Ngoài 2 cách trên, bạn cũng có thể sử dụng class Validator để validate với cú pháp:

Validator::make($inputs, $rules, $messages $attributes);

Trong đó:

  • $inputs là một mảng dữ liệu chứa các dữ liệu bạn cần validate.
  • $rules là một mảng dữ liệu với key là các input name, value là các rule mà bạn muốn ràng buộc.
  • $messages là một mảng dữ liệu chứa các custom message của bạn. Trường này có thể bỏ trống.
  • $attributes là một mảng dữ liệu chứa các custom attribute của bạn. Trường này có thể bỏ trống.

VD:

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use Illuminate\Support\Facades\Validator;

Route::get('store', function (Request $request) {
    $validator = Validator::make($request->all(), [
        'title' => 'required|unique:posts|max:255',
        'body' => 'required',
    ]);
})->name('store');

Lúc này để thực hiện validate các bạn sử dụng phương thức validate.

VD:

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use Illuminate\Support\Facades\Validator;

Route::get('store', function (Request $request) {
    Validator::make($request->all(), [
        'title' => 'required|unique:posts|max:255',
        'body' => 'required',
    ])->validate();
})->name('store');

Hoặc bạn cũng có thể vừa validate và kiểm tra xem validate có lỗi hay không bằng cách sử dụng phương thức fails.

VD:

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use Illuminate\Support\Facades\Validator;

Route::get('store', function (Request $request) {
    $validator = Validator::make($request->all(), [
        'title' => 'required|unique:posts|max:255',
        'body' => 'required',
    ]);
    if ($validator->fails()) {
        // validate fails
    }
})->name('store');

5. Lời Kết.

Phần này mình chỉ giới thiệu với mọi người các cách Validate, Phần sau mình sẽ giới thiệu với mọi người cách hiển thị error lỗi ra view.

Đăng ký nhận tin.

Chúng tôi chỉ gửi tối đa 2 lần trên 1 tháng. Tuyên bố không spam mail!

Vũ Thanh Tài

About author
The best way to learn is to share
Xem tất cả bài đăng

0 Comments

Bài viết chưa có ai bình luận, hãy là người đầu tiên đi bạn!

Bình luận

Captcha