<?phpuseApp\Http\Controllers\PostController;useIlluminate\Support\Facades\Route;/*|--------------------------------------------------------------------------| Web Routes|--------------------------------------------------------------------------|| Here is where you can register web routes for your application. These| routes are loaded by the RouteServiceProvider within a group which| contains the "web" middleware group. Now create something great!|*/Route::get('/',function () {returnview('welcome');});Route::get('post/create', [PostController::class,'create']);Route::post('/post', [PostController::class,'store']);
<?phpnamespaceApp\Http\Requests;useIlluminate\Foundation\Http\FormRequest;classStorePostextendsFormRequest{/** * Determine if the user is authorized to make this request. * * @returnbool */publicfunctionauthorize() {returntrue; }/** * Get the validation rules that apply to the request. * * @returnarray<string, mixed> */publicfunctionrules() {return ['title'=>'required|max:100','body'=>'required|min:50' ]; }}
<?phpnamespaceApp\Http\Controllers;useIlluminate\Http\Request;useApp\Http\Requests\StorePost;classPostControllerextendsController{/** * Display a listing of the resource. * * @return\Illuminate\Http\Response */publicfunctionindex() {// }/** * Show the form for creating a new resource. * * @return\Illuminate\Http\Response */publicfunctioncreate() {returnview('posts.create'); }/** * Store a newly created resource in storage. * * @param\Illuminate\Http\Request $request * @return\Illuminate\Http\Response */publicfunctionstore(StorePost $request) { $validated = $request->validated(); }/** * Display the specified resource. * * @paramint $id * @return\Illuminate\Http\Response */publicfunctionshow($id) {// }/** * Show the form for editing the specified resource. * * @paramint $id * @return\Illuminate\Http\Response */publicfunctionedit($id) {// }/** * Update the specified resource in storage. * * @param\Illuminate\Http\Request $request * @paramint $id * @return\Illuminate\Http\Response */publicfunctionupdate(Request $request, $id) {// }/** * Remove the specified resource from storage. * * @paramint $id * @return\Illuminate\Http\Response */publicfunctiondestroy($id) {// }}
Ủy quyền form request (Authorizing form request) Chú ý: method authorize in C:\xampp8\htdocs\plugindev\app\Http\Requests\StorePost.php
Nếu returntrue; thì Thay vì mình nhận mã lỗi 422, thì bây giờ lại là 403 cùng với thông báo "This action is unauthorize".
method này sẽ quyết định rằng ta được quyền gửi form request đến controller hay là không với boolean true hoặc false.
Với method này, ta có thể ứng dụng để kiểm tra xem tài nguyên có thuộc về sở hữu của người dùng trong việc chỉnh sửa hoặc xóa tài nguyên. Chẳng hạn hệ thống sẽ kiểm tra ID bài viết có thuộc về quyền sở hữu của tác giả hay không để tiếp tục thực thi chỉnh sửa hoặc xóa bài viết.
Adding After Hooks To Form Requests
Tiêu đề này khó dịch sát nghĩa nên mình sẽ để nguyên như Laravel Docs. Việc này sẽ giống như bạn có thể đính kèm một callback sau khi việc validation hoàn tất. Để làm được nó, bạn chỉ cần khai báo method withValidator trong form request với nội dung sau:
Tùy chỉnh thông báo lỗi (Customizing the error message)
Bạn có thể tùy chỉnh thông báo lỗi bằng method messages trong form request. Method này sẽ trả về mảng thuộc tính/rule và các thông báo lỗi tương ứng. Chẳng hạn với ví dụ trên, mình sẽ định nghĩa thêm method messages cho form request StorePost.
<?phpnamespaceApp\Http\Requests;useIlluminate\Foundation\Http\FormRequest;classStorePostextendsFormRequest{/** * Determine if the user is authorized to make this request. * * @returnbool */publicfunctionauthorize() {returntrue; }/** * Get the validation rules that apply to the request. * * @returnarray<string, mixed> */publicfunctionrules() {return ['title'=>'required|max:100','body'=>'required|min:50' ]; }publicfunctionwithValidator($validator) { $validator->after(function ($validator) { $validator->errors()->add('field','Something is wrong with this field!'); }); }publicfunctionmessages() {return ['title.required'=>'Tiêu đề bài viết không được bỏ trống','body.required'=>'Nội dung bài viết không được bỏ trống' ]; }}
Tùy chỉnh thuộc tính validation (Customizing the validation attribute)
Nhìn kết quả trên khá ok nhưng các bạn sẽ cảm thấy không chuyên nghiệp cho lắm, vì :attribute mặc định sẽ lấy name của request được gửi đến để làm thông báo lỗi. Nhưng Laravel đã cung cấp cho chúng ta method attributes để thay đổi thiết lập đó.
<?phpnamespaceApp\Http\Requests;useIlluminate\Foundation\Http\FormRequest;classStorePostextendsFormRequest{/** * Determine if the user is authorized to make this request. * * @returnbool */publicfunctionauthorize() {returntrue; }/** * Get the validation rules that apply to the request. * * @returnarray<string, mixed> */publicfunctionrules() {return ['title'=>'required|max:100','body'=>'required|min:50' ]; }publicfunctionwithValidator($validator) { $validator->after(function ($validator) { $validator->errors()->add('field','Something is wrong with this field!'); }); }// public function attributes()// {// return [// 'title' => 'Tiêu đề bài viết',// 'body' => 'Nội dung bài viết'// ];// }}
Sau
<?phpnamespaceApp\Http\Requests;useIlluminate\Foundation\Http\FormRequest;classStorePostextendsFormRequest{/** * Determine if the user is authorized to make this request. * * @returnbool */publicfunctionauthorize() {returntrue; }/** * Get the validation rules that apply to the request. * * @returnarray<string, mixed> */publicfunctionrules() {return ['title'=>'required|max:100','body'=>'required|min:50' ]; }publicfunctionwithValidator($validator) { $validator->after(function ($validator) { $validator->errors()->add('field','Something is wrong with this field!'); }); }publicfunctionattributes() {return ['title'=>'Tiêu đề bài viết','body'=>'Nội dung bài viết' ]; }}