Hướng dẫn Validate form động ở Laravel 5

Nếu bạn đã từng dùng thử hệ thông form validation của Laravel bạn sẽ thấy nó là 1 hệ thống rất mạnh mẽ. Nó làm những công việc quen thuộc, nhàm chán, khó khăn trở lên đơn giản nhưng vẫn hoạt động tốt.

Trong bài viết này tôi muốn chỉ cho các bạn các đơn giản và dễ dàng nhất để validate những form mà có chứa các input động. Trường hợp thông dụng là form mà cho phép user có thể add thêm hay remove các input trong form.

Đây là hình ảnh của 1 form mẫu như vây:

Trong form này khi người dùng click nút "add new" thì sẽ tạo thêm 1 ô textbox nữa, việc này sẽ được xử lý bằng Javascript và nó ngoài phạm vi của bài viết này.

Đây sẽ là phần code PHP demo cho form này

<input type="text" class="form-control" name="name" value="name">

@for ($i=0; $i < 2; $i++)
    <input type="text" name="items[{{ $i }}]" value="{{ $i }}">
@endforeach

Để handle việc validate thì có vài options như: Validation::make facade, Controller validation và Form Request. Trong bài viết này tôi sẽ dùng tính năng Form Request, việc implement dùng các options khác là tương tự nhé.

Tạo 1 form request

Để tạo form request bạn có thể dùng lệnh của Artisan để generate ra file 1 cách tự động như sau:

$ php artisan make:request OrderRequest
Request created successfully.

Giờ bạn mở file app/Http/Requests/OrderRequest.php, bạn sẽ thấy nội dung như sau:

<?php namespace AppHttpRequests;

use AppHttpRequestsRequest;

class OrderRequest extends Request {

  public function authorize()
  {
    return false;
  }

  public function rules()
  {
    return [
      //
    ];
  }
}

Chỉnh lại Authorize

Bước đầu tiên là custom lại hàm authorize(). Ở đây ta ko cần kiểm tra quyền user nên chỉ việc return true luôn:

public function authorize()
{
  return true;
}

Thêm custom validation rules

Tiếp theo ta chỉnh sửa đến hàm rules(), bạn có thể dùng rất nhiều các rules có sẵn của Laravel, tham khảo tại đây: http://laravel.com/docs/5.0/validation#available-validation-rules. Trong trường hợp của chúng ta, tôi sẽ cần validate trường name là bắt buộc nhập và tối đa chỉ 10 ký tự. Để làm được điều này ta phải lặp qua mảng items đã được post lên như sau:

public function rules()
{
  $rules = [
    'name' => 'required|max:255',
  ];

  foreach($this->request->get('items') as $key => $val)
  {
    $rules['items.'.$key] = 'required|max:10';
  }

  return $rules;
}

Điều quan trọng của đoạn code trên chính là phần array key. Laravel cho phép bạn dùng dấu chấm cho mỗi item, ví dụ $rules['items.1'] sẽ map với<input name="items[1]"...`

Lúc này khi chạy thử bạn sẽ nhận được thông báo lỗi:

Validation Messages

Để xử lý messages bạn dùng hàm messsages() và lặp tương tự như phần rules

public function messages()
{
  $messages = [];
  foreach($this->request->get('items') as $key => $val)
  {
    $messages['items.'.$key.'.max'] = 'The field labeled "Book Title '.$key.'" must be less than :max characters.';
  }
  return $messages;
}

Lúc này kết qủa sẽ là:

Kết luận

Như bạn thấy Laravel Validation rất là mạnh, và với Form Request(mới ở Laravel 5) việc xử lý validate càng dễ dàng và thuận tiện hơn rất nhiều.


All Rights Reserved