Xử Lý Validate Request Trong Laravel với Form Request
Giới thiệu
Khi làm việc với bất kì ngôn ngữ lập trình nào thì việc kiểm tra tính hợp lệ của các dữ liệu input là điều không thể thiếu, đặc biệt khi dữ liệu input đến từ phía người sử dụng thông qua các dạng form. Laravel sẽ cung cấp cho bạn các tính năng để thực hiện công việc kiểm tra dữ liệu đầu vào này.

Xử lý trong controller
- Ví dụ dưới đây là validator của một UserController
<?php namespace App\Http\Controllers\API\v1\Users; use App\Http\Controllers\Controller; use Illuminate\Http\Request; use Illuminate\Support\Facades\Validator; use App\Entities\Models\User; class UserController extends Controller { public function store(Request $request) { // validate incoming request $validator = Validator::make($request->all(), [ 'email' => 'required|email|unique:users', 'name' => 'required|string|max:50', 'password' => 'required' ]); if ($validator->fails()) { Session::flash('error', $validator->messages()->first()); return redirect()->back()->withInput(); } // finally store our user } }
- Cách này hoàn toàn đúng, không có gì là sai, nhưng đây không phải là cách tốt nhất khi mà validator trong controller, vì controller chỉ nên là nơi xử lý logic các request từ route và trả về các phản hồi .
- Viết validator xác nhận trong controller sẽ phá vỡ Nguyên tắc chịu trách nhiệm duy nhất (Single Responsibility Principle).Xem tại Lập trình hướng đối tượng PHP – phần 5
- Chúng ta đều biết rằng các yêu cầu có thể thay đổi theo thời gian . Vì vậy, có nhiều trách nhiệm trong lớp đơn khiến việc quản lý sẽ khó khăn hơn .
Xử lý với Form Request
- Và để khắc phục cách trên, Laravel đã có Form Request, một lớp yêu cầu riêng biệt chứa validation xác thực. Để tạo một lớp
FormRequest
, bạn có thể sử dụng lệnh Artisan bên dưới.php artisan make:request UserStoreRequest - Khi đó một lớp UserRequest sẽ được tạo ra trong thư mục app\Http\Request
<?php namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; class UserStoreRequest extends FormRequest { /** * Determine if the user is authorized to make this request. * * @return bool */ public function authorize() { return true; } /** * Get the validation rules that apply to the request. * * @return array */ public function rules() { return [ 'email' => 'required|email|unique:users', 'name' => 'required|string|max:50', 'password' => 'required' ]; } /** * Custom message for validation * * @return array */ public function messages() { return [ 'email.required' => 'Email is required!', 'name.required' => 'Name is required!', 'password.required' => 'Password is required!' ]; } }
- Lớp
FormRequest
có hai phương thức mặc định làauth ()
vàrules ()
. - Bạn có thể thực hiện bất kỳ logic ủy quyền nào trong phương thức
auth ()
cho dù người dùng hiện tại có được phép yêu cầu hay không. Và trong phương thứcrules ()
bạn có thể viết tất cả các quy tắc hợp lệ của bạn. - Có một phương thức
messages()
nơi bạn có thể truyền mảng thông báo xác thực của riêng mình.
Và bây giờ chúng ta có thể sử dụng lớp UserStoreRequest
này cho lớp UserController
thay vì viết trực tiếp trong controller, giúp code trở nên trong sạch hơn =)))
<?php namespace App\Http\Controllers\API\v1\Users; use App\Http\Controllers\Controller; use App\Http\Requests\UserStoreRequest; class UserController extends Controller { public function store(UserStoreRequest $request) { // Tất cả Request đã được validated bởi UserStoreRequest ,sau đó mới chạy đoạn code phía dưới dd($request->name); } }
- Nếu xác nhận không thành công, nó sẽ chuyển hướng người dùng đến vị trí trước đó với một lỗi.
- Tùy thuộc vào thông báo lỗi loại yêu cầu của bạn sẽ được flash trong session. Nếu yêu cầu là một AJAX thì một error với status: 422 sẽ được trả về ở định dạng JSON.