Custom Validation Rules In Laravel 5.5
Bài đăng này đã không được cập nhật trong 7 năm
Mở đầu
Như các bạn đã biết, Laravel 5.5 đã chính thức "ra mắt" được một thời gian. Ngoài việc, phiên bản này là phiên bản LTS (Long Team Support) thì so với các phiên bản trước đó, những tính tăng mới không còn có điểm gì quá nổi bật. Theo cá nhân tôi, đây cũng là điều dễ hiểu vì Laravel đã đạt đến độ "ổn định" cần thiết, các thành phần đã kết dính "vững bền" để làm lên tên tuổi của một php framework đẳng cấp. Nói là không nổi bật thôi chứ những tính năng mới trong phiên bản 5.5 cũng đã giúp ích khá nhiều cho lập trình viên có thể viết code được "SOLID" hơn. Sau đây, tôi sẽ dịch lại bài viết "Custom Validation Rules In Laravel 5.5" của Taylor Otwell từ medium để nói về tính năng mà tôi hay sử dụng nhất.
Bài viết
Gần đây, Adam Wathan đã chỉ cho tôi thấy cách mới để viết "Custom Validation Rules" mà anh ấy đã áp dụng trong dự án của mình. Vì vậy, trong một buổi sáng, Adam và tôi đã quyết định tích hợp tính năng này vào Laravel, tôi thấy rất vui với kết quả đã đạt được.
Khai báo
Tôi sẽ sử dụng một đoạn mã tôi viết gần đây để giới thiệu tính năng này. Trong ứng dụng của mình, tôi cần xác minh rằng một "Github Repository" và "brach" có thực sự tồn tại. Tất nhiên, chỉ có một cách duy nhất là tạo một API gọi tới Github. Yêu cầu này là một trường thích hợp với việc gộp nó lại trong một "custom validation rule". Để bắt đầu, chúng ta đơn giản là tạo ra một class với hai methods passes và message. Tôi để class ngày trong namespace App\Rules.
<?php
namespace App\Rules;
use App\Source;
use Illuminate\Contracts\Validation\Rule;
class ValidRepository implements Rule
{
/**
* The source control provider instance.
*
* @var \App\Source
*/
public $source;
/**
* The branch name.
*
* @var string
*/
public $branch;
/**
* Create a new rule instance.
*
* @param \App\Source $source
* @param string $branch
* @return void
*/
public function __construct($source, $branch)
{
$this->source = $source;
$this->branch = $branch;
}
/**
* Determine if the validation rule passes.
*
* @param string $attribute
* @param mixed $value
* @return bool
*/
public function passes($attribute, $value)
{
if (! $this->source instanceof Source) {
return false;
}
return $this->source->client()->validRepository(
$value, $this->branch
);
}
/**
* Get the validation error message.
*
* @return string
*/
public function message()
{
return 'The given repository is invalid.';
}
}
Chúng ta sẽ cùng tìm hiểu đoạn code này. Method passes sẽ nhận tham số attribute và value từ Laravel Validator. attribute chính là tên của trường sẽ được validate, trong khi value sẽ chứa giá trị của trường đó. Method này chỉ cần trả về true hoặc false tùy thuộc vào điều khiện value có hợp lệ hay không.
Trong ví dụ của tôi, Source là Eloquent Model đại diện cho một nhà cung cấp dịch vụ quản lý mã nguồn như Github.
Method message cần trả về thông báo lỗi thích hợp khi dữ liệu không hợp lệ. Tất nhiên, bạn nên lấy dữ liệu từ validation files.
Sử dụng
Khi chúng ta đã khai báo xong "custom validation rule", chúng ta có thể sử dụng nó trong một Request. Để gán Rule cho một trường, chúng ta đơn giản là để nó trong array of rules. Trong ví dụ này, tôi sẽ sử dụng phương thức validate, nó đã được tích hợp trong Request từ phiên bản 5.5:
<?php
use App\Rules\ValidRepository;
$request->validate([
'repository' => [
'required',
new ValidRepository($this->source(), $request->branch),
],
]);
Tất nhiên, bạn cũng có thể sử dụng "custom rule" với một FormRequest hoặc bất cứ nơi nào bạn bạn cần kiểm chứng dữ liệu.
Tính năng mới này cung cấp một cách nhan gọn, dễ dàng để khai báo một custom validation rules, và tôi đã sử dụng tính năng này rất nhiều trong code của mình. Tôi hy vọng bạn cũng vậy. Hãy tận hưởng nó.
Kết luận
Trên đây, chắc hẳn các bạn đều đã hiểu được hết ý nghĩa cũng như cách sử dùng của custom validation rules trong Laravel. Tôi hy vọng, tất cả mọi người điều có thể sử dụng tình năng này một cách hợp lý để làm code trong sáng hơn.
Tham khảo
https://medium.com/@taylorotwell/custom-validation-rules-in-laravel-5-5-c6cb250f65df
All rights reserved