Laravel Tutorial

Bài 18: Validation trong Laravel – Phần 1

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

1. 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:

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ể để trống

Ví dụ: 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');

Hoặc

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

2. Validation sử dụng form request

Để 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

Ví dụ: tạo 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

Ví dụ:

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 false;
    }

    /**
     * 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.

Ví dụ: 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 false;
    }

    /**
     * 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.

Ví dụ: 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


<?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.

Ví dụ: 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),
    ]);
}

3. 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.

Ví dụ:


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

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

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');

 

 

 

Leave a Comment