Xử Lý Validate Request Trong Laravel với Form Request

0

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

Hầu hết chúng ta đều quen thuộc với việc sử dụng Validator trong Controller. Và đó là cách phổ biến nhất để xử lý xác thực cho yêu cầu đến.
  • 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ức rules () 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.
Leave A Reply

Your email address will not be published.