Custom Validation Rule Laravel 5.5

Giới thiệu

Laravel 5.5

Như các bạn đã biết Laravel 5.5 mới được released vào 30/8 và là version LTS (Long Term Support) thứ hai sau version Laravel 5.1. Sự thành lập này cũng đem theo nhiều chức năng cải tiến đáng mong muốn như là:

BelongsToMany của Eloquent đổi khác thứ tự parameters, app bảng pivot Thuộc tính $pivotParent của Eloquent Thuộc tính $exists của model vẫn là true khi dùng soft delete Thêm hàm withCount(‘foo as bar_count’) với giúp đỡ alias cho tên field Định dạng được content exception bằng JSON output Các hàm của validator chuyển hết thành public thay vị protected Thêm thư mục routes nằm ngoài cho việc được hiểu các routes của app, lúc trước routes nằm trong app/Http/routes.php Các hàm tiện ích của Request đổi khác hành vi trả kết quả: has(), only(). Bỏ hàm intersect() Headless Chrome testing: thân thiện với Laravel Dusk 2.0.0 Thuộc tính $dispatchesEvents của Eloquent Hàm request($key) không nhận parameter dạng nested key như foo.bar nữa, thay vào đó dùng hàm $request->input($key) Truyền biến ra view có thể dùng tên hàm động view($viewName)->withMyVariable($value), ra ngoài view sẽ dùng tên biến là $myVariable MiddleWare group, tách riêng cho nhiều mục đích dùng khác nhau Có thể custom derectives cho biểu thức if của Blade để viết ngắn hơn giúp đỡ render email template ra browser, thân thiện cho Mailables

Và còn một vài điểm đổi khác nữa các bạn có thể đọc trong trang chủ của Laravel. Và hôm nay mình xin phép được giới thiệu 1 chức năng mới đó là Custom Validation Rule.

Custom Validation Rule là gì

Laravel cung ứng cho ta một vài hàm validate có sẵn như là min, max, required, numeric, after, …. https://laravel.com/docs/5.5/validation#available-validation-rules. Mục đích sinh ra validate rule là để tái dùng nhiều lần và dùng nó một cách rất dễ chỉ bằng cách gọi tên như mình vừa liệt kê ở trên. Mặc dù cung ứng nhiều đấy nhưng đôi khi ta vẫn cần phải viết thêm những hàm validate riêng trong app của mình.
sau đây mình xin nêu ra 2 cách custom cho những bạn dùng Laravel < 5.5 và Laravel 5.5

Bài toán

đề xuất: xác định biến truyền vào phải là yêu cầu và là số chẵn.

Custom Validation Rule với Laravel < 5.5

Bước 1. Tạo Route và Controller
Ở bước này, ta sẽ tạo ra 2 route, một cái để get method đưa ra view còn một cái cho post method dùng để submit
app/Http/routes.php:

Route::get('getCustom', '[email protected]'); //get method Route::post('postCustom', '[email protected]'); //post method 

Tiếp đến ta sẽ tạo CustomValidateController và viết đoạn vận chuyển tận nhàe sau đây:
app/Http/Controllers/CustomValidateController.php:

namespace App\Http\Controllers; use Illuminate\Http\Request; class CustomValidateController extends Controller {     public function getCustom()     {         return view('custom_validate');     }     public function postCustom(Request $request)     {         $this->validate($request, [             'number' => 'required|is_even', //required: yêu cầu, is_even: là số chẵn         ]);         print_r('done');     } } 

Bước 2. Khai báo Validation
Ở bước tiếp nữa này, mình sẽ khai báo và viết vận chuyển tận nhàe validation cho is_even vì nó không được Laravel giúp đỡ. Mình sẽ viết trong file app/Providers/AppServiceProvider.php:

namespace App\Providers; use Illuminate\Support\ServiceProvider; use Validator; class AppServiceProvider extends ServiceProvider {     public function boot()     {         Validator::extend('is_even', function($attribute, $value, $parameters, $validator) {             if(!empty($value) && $value % 2 == 0){ //check biến đó không rỗng và chia hết cho 2                 return true;             }                 return false;         });     }     public function register()     {     } } 

Và giờ đây ta phải đưa ra 1 message thông tin lỗi cho người sử dụng, bạn nên dùng trans và khai báo message trong file resoueces/lang/en/validation.php như sau đây:

return [     'is_even' => "The :attribute must be even.",     'accepted' => 'The :attribute must be accepted.',     ..... ] 

Bước 3. Tạo View
Bước này để tạo 1 view demo, các bạn chỉ cần copy đoạn vận chuyển tận nhàe này và chạy là xong

<html lang="en"> <head>     <title>Custom Validation Rule Laravel 5</title>     <đường dẫn rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" > </head> <body>     <nav class="navbar navbar-default">         <div class="container-fluid">             <div class="navbar-header">                 <a class="navbar-brand" href="#">Custom Validation Rule Laravel 5</a>             </div>         </div>     </nav>     <div class="container">         <form action="{{ action('[email protected]')}}" class="form-horizontal" method="post">             @if (count($errors) > 0)                 <div class="alert alert-danger">                     <ul>                         @foreach ($errors->all() as $error)                             <li>{{ $error }}</li>                         @endforeach                     </ul>                 </div>             @endif             <input type="text" name="title" class="form-control" style="width:30%" placeholder="Add Even Number" />             <br/>             <button class="btn btn-primary">Save</button>         </form>     </div> </body> </html> 

Custom Validation Rule với Laravel 5.5

Bước 1. Tạo Custom Validation Rule bằng dòng lệnh
Bước đầu tiên, Laravel 5.5 giúp đỡ ta tạo custom validation rules bằng dòng lệnh

php artisan make:rule CheckEvenRule 

Sau khi chạy thành công lệnh trên, bạn sẽ tìm thấy file CheckEvenRule trong thư mục rules của app. Trong file này mình sẽ viết những logic dễ làm đó là nhập vào 1 số chẵn rồi trả về đúng, nếu không thì không làm bất cứ điều gì
app/Rules/CheckEvenRule.php

<?php  namespace App\Rules;  use Illuminate\Contracts\Validation\Rule;  class CheckEvenRule 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)     {         if($value % 2 == 0){             return true;         }     }      /**      * Get the validation error message.      *      * @return string      */     public function message()     {         return 'The :attribute must be even value.';     } } 

Bước 2. Tạo Route
Bước này mình cũng tạo ra 2 routes, một get method và một post method

Route::get("form","[email protected]"); Route::post("form","[email protected]"); 

Bước 3. Tạo Controller
Giờ ta cần tạo ra file FormController để xử lý logic
app/Http/Controllers/FormController.php

<?php  namespace App\Http\Controllers;  use Illuminate\Http\Request; use App\Rules\CheckEvenRule;  class FormController extends Controller {     /**      * Display a listing of the resource.      *      * @return \Illuminate\Http\Response      */     public function index()     {         return view('myForm');     }      /**      * Display a listing of the resource.      *      * @return \Illuminate\Http\Response      */     public function store()     {         $input = request()->validate([                 'name' => 'required',                 'number' => [                     'required',                      new CheckEvenRule()                 ]             ]);          dd("You can proceed now...");     } } 

Bước 4. Tạo View
sau cùng bạn chỉ cần tạo view để demo
resources/views/myForm.blade.php

<!DOCTYPE html> <html> <head>     <title>Laravel 5.5 custom validation rules example</title>     <meta charset="utf-8">     <meta http-equiv="X-UA-Compatible" content="IE=edge">     <meta name="viewport" content="width=lập trình viênice-width, initial-scale=1">     <đường dẫn href="//netdna.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css" rel="stylesheet"> </head>  <body>     <div class="container">         <h1>Laravel 5.5 custom validation rules example</h1>         <form method="POST" action="{{ action('[email protected]') }}">             {{ csrf_field() }}              <div class="form-group">                 <label>Name:</label>                 <input type="text" name="name" class="form-control" placeholder="Name">                 @if ($errors->has('name'))                     <span class="text-danger">{{ $errors->first('name') }}</span>                 @endif             </div>              <div class="form-group">                 <label>Number:</label>                 <input type="number" name="number" class="form-control" placeholder="Number">                 @if ($errors->has('number'))                     <span class="text-danger">{{ $errors->first('number') }}</span>                 @endif             </div>              <div class="form-group">                 <button class="btn btn-success btn-submit">Submit</button>             </div>          </form>     </div> </body> </html> 

Kết luận

Như 2 ví dụ ở trên, các bạn có thể thấy Laravel 5.5 giúp đỡ việc viết Custom Validation một cách dễ hiểu và trong sáng hơn bằng cách tạo file Rule chứ không phải viết tất cả trong hàm boot() trong AppServiceProvider ở Laravel < 5.5. Việc viết vận chuyển tận nhàe trở nên clear hơn nhiều.

Bài viết của mình xin hoàn thành ở đây. Cảm ơn các bạn đã đón đọc!

Tham khảo

https://laravel.com/docs/5.4/validation#custom-validation-rules https://laravel.com/docs/5.5/validation#custom-validation-rules

Nguồn viblo.asia