Tạo Custom Validation Rule trong Laravel: Tối Ưu Hóa Kiểm Tra Dữ Liệu Đầu Vào
Trong quá trình phát triển ứng dụng web, việc đảm bảo dữ liệu người dùng nhập vào là hợp lệ và đúng định dạng là vô cùng quan trọng. Laravel cung cấp sẵn một số rule validation mạnh mẽ, tuy nhiên, trong một số trường hợp đặc thù, bạn cần tạo ra những rule riêng để đáp ứng yêu cầu đặc thù của ứng dụng. Đây chính là lúc mà Custom Validation Rule trở nên hữu ích.
Tại sao cần tạo Custom Validation Rule?
Hãy tưởng tượng bạn đang xây dựng một hệ thống dành cho thị trường Nhật Bản, nơi mà số điện thoại và mã bưu điện cần tuân theo những quy chuẩn nghiêm ngặt. Laravel có nhiều rule mặc định như required
, email
, max
,… nhưng lại không có rule nào dành riêng cho việc kiểm tra số điện thoại hay mã bưu điện của Nhật. Thay vì phải lặp lại cùng một logic validation ở nhiều nơi, việc tạo Custom Validation Rule giúp bạn:
- Tái sử dụng code: Một lần viết, sử dụng ở nhiều nơi.
- Bảo trì dễ dàng: Khi cần thay đổi logic, bạn chỉ cần sửa ở một chỗ.
- Đảm bảo tính chính xác: Mọi input được kiểm tra đúng chuẩn mà không bị bỏ sót.
Bắt đầu tạo Custom Validation Rule
Laravel giúp việc tạo Custom Rule trở nên đơn giản với Artisan command. Dưới đây là hướng dẫn chi tiết cách tạo Custom Validation Rule để kiểm tra số điện thoại và mã bưu điện hợp lệ tại Nhật Bản.
1. Tạo Custom Rule cho Số Điện Thoại
Để tạo một rule kiểm tra số điện thoại hợp lệ, bạn sử dụng Artisan command:
php artisan make:rule JapanesePhoneNumber
ShellScriptSau khi chạy lệnh trên, bạn sẽ thấy file JapanesePhoneNumber.php xuất hiện trong app/Rules
. Tiếp theo, mở file này và thêm logic kiểm tra như sau, giả sử chúng tạo tạo 1 Rule kiểm tra số điện thoại hợp lệ ở Nhật Bản:
<?php
namespace App\Rules;
use Illuminate\Contracts\Validation\Rule;
class JapanesePhoneNumber implements Rule
{
public function passes($attribute, $value)
{
// Regex pattern cho số điện thoại Nhật Bản
$pattern = '/^(0\d{1,4}-\d{1,4}-\d{4})|(0[5789]0-\d{4}-\d{4})$/';
return preg_match($pattern, $value);
}
public function message()
{
return 'The :attribute must be a valid Japanese phone number.';
}
}
PHP2. Tạo Custom Rule cho Mã Bưu Điện
Tương tự, để tạo rule cho mã bưu điện:
<?php
namespace App\Rules;
use Illuminate\Contracts\Validation\Rule;
class JapanesePostalCode implements Rule
{
public function passes($attribute, $value)
{
// Regex pattern cho mã bưu điện Nhật Bản
$pattern = '/^\d{3}-\d{4}$/';
return preg_match($pattern, $value);
}
public function message()
{
return 'The :attribute must be a valid Japanese postal code.';
}
}
PHP3. Áp dụng Custom Rule vào Validation
Sau khi tạo xong các rule, bạn có thể sử dụng chúng trong validation của request:
use App\Rules\JapanesePhoneNumber;
use App\Rules\JapanesePostalCode;
$request->validate([
'phone' => ['required', new JapanesePhoneNumber],
'postal_code' => ['required', new JapanesePostalCode],
]);
PHPGiả sử chúng ta tạo tệp tin App\Http\Requests\CustomerRequest.php như sau:
<?php
namespace App\Http\Requests;
use App\Rules\JapanesePhoneNumber;
use App\Rules\JapanesePostalCode;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Support\Facades\Auth;
class CustomerRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return Auth::guard('manager')->check();
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
$rules = [
'customer_group_id' => 'required|min:0',
'firstname' => 'nullable|string|max:32',
'lastname' => 'required|string|max:32',
'email' => 'required|string|max:191|unique:customers,email',
'password' => 'nullable|string|min:8|confirmed',
'password_confirmation' => 'nullable|string|min:8|required_with:password',
'phone' => ['nullable', 'string', 'min:10', 'max:32', new JapanesePhoneNumber],
'wishlist' => 'nullable|string|max:65535',
'newsletter' => 'nullable|in:0,1',
'address_id' => 'nullable|integer|min:0',
'approved' => 'nullable|in:0,1',
'addresses' => 'nullable|array',
'addresses.*.country_id' => 'required|numeric|min:1',
'addresses.*.city' => 'required|numeric|min:1|max:47',
'addresses.*.postcode' => ['required', 'min:7', 'max:7', new JapanesePostalCode],
'addresses.*.address_1' => 'required|string|max:125',
'addresses.*.address_2' => 'required|string|max:125',
'addresses.*.company' => 'nullable|string|max:125',
'addresses.*.is_default' => 'required|in:0,1',
];
if( $this->id == 0 ){
$rules['password'] = 'required|string|min:8|max:26|confirmed';
} else {
$rules['email'] = 'required|email|max:191|unique:customers,email,'.$this->id;
}
return $rules;
}
/**
* Get custom attributes for validator errors.
*
* @return array
*/
public function attributes()
{
return [
'customer_group_id' => __('Customer Group'),
'firstname' => __('First Name'),
'lastname' => __('Last Name'),
'email' => __('Email'),
'password' => __('Password'),
'password_confirmation' => __('Confirm Password'),
'phone' => __('Phone'),
'wishlist' => __('Wishlist'),
'newsletter' => __('Newsletter'),
'address_id' => __('Address'),
'approved' => __('Approved'),
'address.*.country_id' => __('Country'),
'address.*.city' => __('Prefecture'),
'address.*.postcode' => __('Postal Code'),
'address.*.address_1' => __('Address 1'),
'address.*.address_2' => __('Address 2'),
'address.*.company' => __('Company'),
'address.*.is_default' => __('Is Default'),
];
}
}
4. Kết luận
Custom Validation Rule là công cụ mạnh mẽ giúp bạn đảm bảo dữ liệu đầu vào trong ứng dụng luôn hợp lệ theo các tiêu chuẩn riêng. Việc tạo và sử dụng Custom Rule không chỉ giúp code của bạn trở nên gọn gàng, dễ bảo trì mà còn đảm bảo tính chính xác và an toàn cho hệ thống. Hãy thử nghiệm và áp dụng vào dự án của bạn ngay hôm nay để thấy được sự khác biệt!
Laravel không chỉ là một framework mạnh mẽ mà còn cực kỳ linh hoạt, cho phép bạn mở rộng theo bất kỳ yêu cầu nào của dự án. Với Custom Validation Rule, bạn có thể tự tin rằng dữ liệu đầu vào luôn tuân theo những chuẩn mực nghiêm ngặt mà bạn đặt ra.