Laravel Tutorial

Bài 19: Validation trong Laravel – Phần 2

Tiếp theo phần trước, ở phần này chúng ta sẽ cùng nhau tìm hiểu các cách hiển thị error, thêm rule trong validation

1. Hiển thị error massage

Khi thực hiện validate data, nếu như không pass thì Laravel sẽ return về một MassageBag (Illuminate\Support\MessageBag) chứa các error massage. Và Laravel sẽ tự động gán MassageBag vào trong $errors trong views

# Lấy ra 1 phần error message

Lấy ra error message lỗi đầu tiên của trường email

$errors = $validator->errors();

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

Hoặc trong blade template

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

Để lấy ra tất cả message của một trường nào đó các bạn có thể sử dụng phương thức get. Hàm này sẽ trả về một mảng các message lỗi của trường đó.

Ví dụ: Lấy ra tất cả các message lỗi của trường email

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

Nếu input của bạn là một mảng, bạn có thể lấy ra tất cả error message trong mảng input key đó bằng cách sử dụng ký tự ‘*

Ví dụ: Lấy ra error massage của các attachments

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

# Lấy ra tất cả error message

Muốn lấy ra tất cả các các error message của validator, bạn có thể sử dụng phương thức all

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

# Kiểm tra sự tồn tại của error message

Để kiểm tra xem trường nào đó có tồn tại error message hay không, bạn có thể sử dụng phương thức has. Phương thức này sẽ trả về true nếu trường đó có error message

Ví dụ: Kiểm tra xem validate input email có sai hay không

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

2. Sửa nội dung error message

Mặc định các message trong Laravel được đặt trong resources/lang/en/validation.php

Và nếu như bạn muốn thay đổi nội dung message cho một trường nào đó, bạn có thể thêm vào trong key custom

Ví dụ: Thay đổi error mesage cho trường email với rule reqruire và max

'custom' => [
    'email' => [
        'required' => 'We need to know your email address!',
        'max' => 'Your email address is too long!'
    ],
],

Bạn cũng có thể custom attribute bằng cách thiết lập trong key attribute

Ví dụ: Thay đổi attribute name của trường email

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

3. Các rule có sẵn trong Laravel

Do Laravel cung cấp rất nhiều rule, nên mình chỉ liệt kê ra một số rule hay dùng thôi. Các bạn có thể xem toàn bộ những rule mà Laravel hỗ trợ sẵn tại đây

Rule Mô Tả
accepted Rule này chỉ chấp nhận các giá trị "yes""on"1, hoặc true. Rule này thường được dùng cho các input là radio, checkbox.
active_url Rule này sẽ kiểm tra xem URL này có đang thực sự tồn tại, bằng việc sử dụng hàm dns_get_record trong PHP.
after Rule này sẽ kiểm tra xem ngày tháng có đang lớn hơn giá trị cần so sánh không.

VD: ‘start_date’ => ‘required|date|after:tomorrow’

before Rule này tương tự after nhưng là so sánh nhỏ hơn.
alpha Rule này sẽ kiểm tra xem data gửi lên có phải là các ký tự alphabetic.
alpha_num Rule này sẽ kiểm tra xem dữ liệu có phải là các kí tự alphabetic và số.
array Rule này sẽ kiểm tra xem dữ liệu có phải là array.
bail Rule này sẽ dừng việc validate dữ liệu nếu như có một rule nào đó fail.
between:min,max Rule này sẽ kiểm tra xem giá trị có nằm trong khoảng min, max hay không
confirmed Rule này sẽ kiểm tra xem dữ liệu có giống với dữ liệu của field_confirmation hay không.

VD: Với trường hợp xác thực password thì nó sẽ kiểm tra xem dữ liệu password_confirmation có trùng với password hay không.

date Kiểm tra xem dữ liệu gửi lên có phải là date không.
dimensions Rule này sẽ kiểm tra kích thước của ảnh upload lên.

VD: 'avatar' => 'dimensions:min_width=100,min_height=200'

email Rule này sẽ kiểm tra xem dữ liệu gửi lên có phải là email.
image Rule này sẽ kiểm tra xem dữ liệu gửi lên có phải image.
in_array:anotherfield Rule này sẽ kiểm tra xem dữ liệu gửi lên có nằm trong mảng anotherfield.
integer Rule này sẽ kiểm tra xem dữ liệu gửi lên có phải số nguyên hay không.
ip Rule này sẽ kiểm tra xem dữ liệu gửi lên có phải là ip.
ipv4 Rule này sẽ kiểm tra xem dữ liệu gửi lên có phải là ipv4.
ipv6 Rule này sẽ kiểm tra xem dữ liệu gửi lên có phải là ipv6.
json Rule này sẽ kiểm tra xem dữ liệu gửi lên có phải là một json string.
max:value Rule này sẽ kiểm tra xem dữ liệu có nhỏ hơn giá trị value.
min:value Rule này sẽ kiểm tra xem dữ liệu có lớn hơn giá trị value.
not_in:foo,bar Rule này sẽ kiểm tra xem dữ liệu gửi lên không nằm trong mảng.
nullable Rule này sẽ cho phép không cần dữ liệu gửi lên.
numberic Rule này sẽ kiểm tra xem dữ liệu gửi lên có phải là numeric hay không.
regex:pattern Rule này sẽ kiểm tra xem dữ liệu phải matching vơi pattern.
required Rule này sẽ bắt buộc trường phải có dữ liệu.
string Rule này sẽ bắt buộc dữ liệu phải là string.
unique:table,column,except,idColumn Rule này sẽ kiểm tra dữ liệu bắt buộc phải chưa xuất hiện với điều kiện ở trong database.
url Rule này bắt buộc dữ liệu gửi lên phải là một URL.

4. Thêm mới rule trong Laravel

Nếu như các rule mà Laravel cung cấp không giải quyết được vấn đề của bạn. Bạn có thể tạo mới một rule theo cách của bạn một cách đơn giản bằng cách sử dụng command make:rule. Command này sẽ tạo ra một rule trong app/Rules cho các bạn viết code vào bên trong

Ví dụ: Tạo thêm rule Uppercase để kiểm tra xem data có phải đang ở dạng chữ in hoa hay không

php artisan make:rule Uppercase

Lúc này file rule (app/Rules/Uppercase.php) sẽ có dạng như sau:

<?php

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;

class Uppercase 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.';
    }
}

Trong đó:

  • Phương thức passes mà trả về true thì rule sẽ được pass và ngược lại.
  • Phương thức massage sẽ trả về message string nếu như rule không pass.

Lúc này khi muốn sử dụng rule vào validator bạn chỉ sử dụng như sau:

use App\Rules\Uppercase;

$request->validate([
    'name' => ['required', 'string', new Uppercase],
]);

Ngoài cách tạo thêm rule trên, bạn cũng có thể đưa logic vào trong một closure với cú pháp:

function ($attribute, $value, $fail) {
    if ($value === 'foo') {
        $fail('The '.$attribute.' is invalid.');
    }
}

Trong đó:

  • $attribute là tên của trường cần validate.
  • $value là giá trị của trường cần validate.
  • $fail là một callback function sẽ được gọi khi validate fail.

Ví dụ

use Illuminate\Support\Facades\Validator;

$validator = Validator::make($request->all(), [
    'title' => [
        'required',
        'max:255',
        function ($attribute, $value, $fail) {
            if ($value === 'foo') {
                $fail('The '.$attribute.' is invalid.');
            }
        },
    ],
]);

 

Leave a Comment