Bài 14: Validation - Kiểm tra dữ liệu nhập vào trong Laravel

Bài 14: Validation - Kiểm tra dữ liệu nhập vào trong Laravel

Thông thường khi có dữ liệu gửi đến từ phía người dùng ta sẽ phải thực hiện công việc kiểm tra xem dữ liệu đó có thỏa mãn các yêu cầu mà chúng ta đặt ra không trước khi tiến hành xử lý tiếp các công việc khác. 

Trong bài này chúng ta sẽ tìm hiểu cách làm việc đó với Validation trong Laravel. Để tạo Validation chúng ta có nhiều cách, trong nội dung bài này chúng ta sẽ tìm hiểu 3 cách để tạo và làm việc với Validation

1. Validation Quickstart

 

Cú pháp Validation trong cách này như sau:

$this->validate($request,$pattern,$messenger,$customName);

Trong đó:

  • $request: Là biến tham chiếu đối tượng Request mà các bạn khai báo ở đầu hàm.
  • $pattern: Là mảng chứa dữ liệu đầu vào.
  • $messenger: Là mảng chứa nội dung báo lỗi (Nếu muốn thay đổi).
  • $customName: Là mảng chứa các tên cho các trường trong form.

Chúng ta có ví dụ sau:

public function login(Request $request)
{
   $pattern = [
      'username' => 'required|min:5|max:255',
      'password' => 'required|min:8|max:32',
   ];

   $messenger = [
      'required' => ':attribute Không được để trống',
      'min' => ':attribute Không được nhỏ hơn :min ký tự',
      'max' => ':attribute Không được lớn hơn :max ký tự',
   ];

   $customName = [
      'username' => 'Tên đăng nhập',
      'password' => 'Mật khẩu',
   ];

  $this->validate($request,$pattern,$messenger,$customName);

  // Some code here
}

Như vậy trong đoạn code trên chúng ta đã Validation cho trường username và trường password

  • username: Không được để trống, độ dài hơn 5 ký tự, độ dài không vượt quá 255 ký tự
  • password: Không được để trống, độ dài hơn 8 ký tự, độ dài không vượt quá 32 ký tự

* Lưu ý: Trường hợp bạn muốn với mỗi field ta sẽ dừng lại không kiểm tra điều kiện tiếp theo nếu điều kiện trước đó lỗi thì ta cần thêm điều kiện bail ở đầu danh sách điều kiện của mỗi field như sau:

public function login(Request $request)
{
   $pattern = [
      'username' => 'bail|required|min:5|max:255',
      'password' => 'bail|required|min:8|max:32',
   ];

   $messenger = [
      'required' => ':attribute Không được để trống',
      'min' => ':attribute Không được nhỏ hơn :min ký tự',
      'max' => ':attribute Không được lớn hơn :max ký tự',
   ];

   $customName = [
      'username' => 'Tên đăng nhập',
      'password' => 'Mật khẩu',
   ];

  $this->validate($request,$pattern,$messenger,$customName);

  // Some code here
}

2. Custom Validation

Với cách này chúng ta sẽ sử dụng Validator facades. Cách này cũng không có quá nhiều khác biệt với cách 1, tuy nhiên trong trường hợp bạn muốn tự mình quyết định khi có lỗi sẽ thực hiện hành động gì hoặc chuyển hướng đi đâu thì có thể dùng cách này

Cú pháp:

Validator::make($request->all(),$pattern,$messenger,$customName);

Trong đó:

  • $request->all(): Là biến tham chiếu đối tượng Request mà các bạn khai báo ở đầu hàm (Dạng mảng).
  • $pattern: Là mảng chứa dữ liệu đầu vào.
  • $messenger: Là mảng chứa nội dung báo lỗi (Nếu muốn thay đổi).
  • $customName: Là mảng chứa các tên cho các trường trong form.

* Lưu ý: Để sử dụng Validator facades thì trong controller chúng ta phải use Validator. Chúng ta xét ví dụ dưới đây để hiểu rõ hơn

<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Illuminate\Http\Request;
use App\Models\User;
use Validator;

class LoginController extends Controller
{
    public function login(Request $request)
   {
     $pattern = [
         'username' => 'required|min:5|max:255',
         'password' => 'required|min:8|max:32',
     ];

      $messenger = [
         'required' => ':attribute Không được để trống',
         'min' => ':attribute Không được nhỏ hơn :min ký tự',
         'max' => ':attribute Không được lớn hơn :max ký tự',
     ];

      $customName = [
          'username' => 'Tên đăng nhập',
          'password' => 'Mật khẩu',
      ];

      Validator::make($request->all(),$pattern,$messenger,$customName);

      if ($validator->fails()) {
           // Nếu Validation fails thì redirect về trang login hoặc hành động do các bạn quy định
            return redirect('login')->withErrors($validator)->withInput();
      }
   }
}

3. Form Request Validation

Với 2 cách trên các bạn có thể dễ dàng validation dữ liệu đầu vào của mình, tuy nhiên nhược điểm của 2 cách trên là tất cả đều phải viết trong controller, điều này khiến controller phình to và gây khó khăn cho việc bảo trì code sau này. Chính vì vậy mình khuyến nghị nên dùng cách thứ 3 là tạo request riêng dùng để Validation dữ liệu:

a. Tạo file request

Để tạo file request các bạn chạy lệnh như sau:

php artisan make:request <className>

Ví dụ chúng ta tạo file request để validation login

php artisan make:request loginRequest

Lệnh này sẽ tạo ra file loginRequest theo đường dẫn sau: app/Http/Requests/loginRequest.php

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

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

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        //
    }
}

Để có thể sử dụng chúng ta sửa

public function authorize()
{
   return false;
}

Thành

public function authorize()
{
   return true;
}

Tiếp theo chúng ta sẽ viết rule

public function rules()
{
  return [
            'username' => 'required|min:5|max:255',
            'password' => 'required|min:8|max:32'
        ];
}

Trường hợp chúng ta muốn tùy chỉnh thông báo lỗi thì chúng ta thêm vào hàm messages()

/**
* Get the error messages for the defined validation rules.
*
* @return array
*/
public function messages()
{
   return [
      'username.required' => __('Bạn chưa nhập Username.'),
      'password.required' => __('Bạn chưa nhập Mật khẩu.'),
      'username.min' => __('Username phải hơn 5 ký tự.'),
      'username.max' => __('Username phải không được vượt quá 255 ký tự.'),
      'username.min' => __('Mật khẩu phải hơn 8 ký tự.'),
      'username.max' => __('Mật khẩu phải không được vượt quá 32ký tự.')
   ];
}

Lúc này nội dung đầy đủ của file sẽ như sau:

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class loginRequest 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 [
            'username' => 'required|min:5|max:255',
            'password' => 'required|min:8|max:32'
        ];
    }
	
	/**
	* Get the error messages for the defined validation rules.
	*
	* @return array
	*/
	public function messages()
	{
	   return [
		  'username.required' => __('Bạn chưa nhập Username.'),
		  'password.required' => __('Bạn chưa nhập Mật khẩu.'),
		  'username.min' => __('Username phải hơn 5 ký tự.'),
		  'username.max' => __('Username phải không được vượt quá 255 ký tự.'),
		  'username.min' => __('Mật khẩu phải hơn 8 ký tự.'),
		  'username.max' => __('Mật khẩu phải không được vượt quá 32ký tự.')
	   ];
	}
}

3. Sửa controller

Chúng ta tiếp tục lấy ví dụ login ở trên, lúc này controller của chúng ta sẽ sửa lại thành như sau:

<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Illuminate\Http\Request;
use App\Models\User;
use App\Http\Requests\loginRequest;

class LoginController extends Controller
{
    public function login(loginRequest $request)
   {
      // some code here
   }
}

Như vậy với cách này chúng ta đã chuyển hẳn phần validation sang một file khác giúp làm gọn và giảm tải cho controller cũng như dễ dàng bảo trì về sau.

4. Hiển thị lỗi Validation ngoài view

Để hiển thị thông báo lỗi ngoài View, đối với Laravel 5.7, 5.8 chúng ta sử dụng cấu trúc như sau:

@if ($errors->any())
    <div class="alert alert-danger">
        <ul>
            @foreach ($errors->all() as $error)
                <li>{{ $error }}</li>
            @endforeach
        </ul>
    </div>
@endif

Ngoài ra để tìm hiểu thêm về Validation các bạn có thể đọc thêm tại đây: Laravel Validation

Post Comment