[Bài đọc] Form Request Validation

4. Validation, Exception & Cookies

Tạo Form Requests

Với những trường hợp validation phức tạp, bạn có thể tạo một “form request”. Form requests là tùy chỉnh class request chứa logic validation. Để tạo class form request, sử dụng lệnh make:request Artisan CLI:

php artisan make:request StoreBlogPost

class được tạo sẽ nằm ở thư mục app/Http/Requests directory. Nếu thư mục đó không tồn tại, nó sẽ được tạo khi bạn chạy lệnh make:request. Chúng ta sẽ thêm một vài quy định validation vào trong phương thưc rules:

Form request được validated trước khi phương thức controller được gọi, nghĩa là bạn không cần viết một mớ hỗn độn logic trong controller:

/**
 * Store the incoming blog post.
 *
 * @param        StoreBlogPost  $request
 * @return    Response
 */
public function store(StoreBlogPost $request)
{
    // The incoming request is valid...
}

Nếu validation thất bại, một chuyển trang response sẽ được tạo ra để gửi cho lại người dùng đến trang trước. Ngoài ra lỗi sẽ được flashed vào session, vì vậy chúng ta có thể hiển thị nó. Nếu request là AJAX request, một HTTP response với mã 422 status sẽ được trả về cho người dùng gồm JSON representation chứa lỗi validation.

Authorizing Form Requests

Class form request ngoài ra còn chứa một phương thức authorize. Bên trong phương thức, bạn có thể xác thực người dùng thực sự đã có quyền cập nhật dữ liệu. Ví dụ, nếu một người dùng cố gắng cập nhật comment của một một bài viết, họ thật sự sở hữa comment đấy? Ví dụ:

/**
 * Determine if the user is authorized to make this request.
 *
 * @return    bool
 */
public function authorize()
{
    $comment = Comment::find($this->route('comment'));

    return $comment && $this->user()->can('update', $comment);
}

Khi tất cả các form requests kế thừa từ class base Laravel request, chúng ta có thể sử dụng phương thức user để truy cập xác thức người dùng. Ngoài ra cũng cần gọi phương thức route trong ví dụ trên. Phương thức này cho phép bạn truy cập đến tham số của URI được định nghĩa trong route được gọi, như tham số {comment} trong ví dụ trên:

Route::post('comment/{comment}');

Nếu phương thức authorize trả về false, một HTTP response với mã 403 status sẽ được tự động trả về và phương thức controller sẽ không được thực hiện.

Nếu bạn có kế hoạch cho phép logic trong một phần khác ứng dung của bạn, đơn giản trả về true từ phương thức authorize:

/**
 * Determine if the user is authorized to make this request.
 *
 * @return    bool
 */
public function authorize()
{
    return true;
}
/**
 * Determine if the user is authorized to make this request.
 *
 * @return    bool
 */
public function authorize()
{
    return true;
}

Tùy biến nội dung lỗi

Bạn có thể muốn tùy biến lỗi dung lỗi bằng cách sử dụng bởi form request bằng cách ghi đè phương thức messages. Phương thức này trả về một mảng các cặp thuộc tính / quy định tương ứng với nội dung lỗi:

/**
 * Get the error messages for the defined validation rules.
 *
 * @return    array
 */
public function messages()
{
    return [
        'title.required' => 'A title is required',
        'body.required'  => 'A message is required',
    ];
}

Leave a Reply

Your email address will not be published. Required fields are marked *