Toidicode.com

Toidicode.com

BASIC TO ADVANCE

Bài 21: Validation trong Laravel 8 (Phần 2)

Phần trước mình đã giới thiệu với mọi người các cách khai báo validation trong Laravel rồi, phần này mình sẽ giới thiệu với mọi người 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 error message đầu tiên của một field các bạn sử dụng phương thức first.

VD: 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

{{ $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 đó.

VD: In 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ự '*'.

VD: Lấy ra error massage của các attachments.

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

Còn trong trường hợp bạn 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.

VD: lấy ra tất cả các error message.

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

Đôi lúc, bạn sẽ cần 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.

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

VD: 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!'
    ],
],

Tương tự bạn cũng có thể custom attribute trong file language, bằng cách thiết lập trong key attribute.

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

3. 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 logic vào trong.

VD: 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 sẽ có dạng như sau:

- app/Rules/Uppercase.php

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

VD:

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.');
            }
        },
    ],
]);

4. Lời kết.

Như vậy mình đã giới thiệu xong với mọi người về validation trong Laravel rồi, các bạn cũng không cần thiết phải nhớ hết các rule trong Laravel vì nó khá là nhiều, lúc nào cần có thế lên docs xem cũng được.

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

1 Comments

thanks a !

mit

3 năm trước

Bình luận

Captcha