---
description: https://viblo.asia/p/tap-20-validation-laravel-GrLZDWAEKk0
---

# 1. Bắt đầu nhanh validation (Validation quickstart)

Laravel cung cấp một số cách tiếp cận khác nhau để xác thực dữ liệu đến ứng dụng của chúng ta. Mặc định, lớp base controller `App\Http\Controllers\Controller` sử dụng một lớp trait `ValidatesRequests`, điều này cung cấp một số method thuận tiện để xác thực các HTTP request với những quy tắc xác thực (validation rule) mạnh mẽ.

## II. Bắt đầu nhanh validation (Validation quickstart) <a href="#ii-bat-dau-nhanh-validation-validation-quickstart-1" id="ii-bat-dau-nhanh-validation-validation-quickstart-1"></a>

Để học về các tính năng xác thực mạnh mẽ của Laravel, hãy xem xét qua ví dụ đầy đủ bên dưới, bao gồm xác thực form và hiển thị lỗi về người dùng.

### 1. Định nghĩa route (Defining the route) <a href="#id-1-dinh-nghia-route-defining-the-route-2" id="id-1-dinh-nghia-route-defining-the-route-2"></a>

Đầu tiên, chúng ta giả sử đăng ký các route sau trong file `routes/web.php`.

```
Route::get('post/create', 'PostController@create');

Route::post('post', 'PostController@store');
```

Route `GET` sẽ hiển thị form để người dụng tạo một bài viết mới, trong khi đó route `POST` sẽ nhận request gửi đến từ người dùng và lưu trữ vào database.

### 2. Khởi tạo controller (Creating the controller) <a href="#id-2-khoi-tao-controller-creating-the-controller-3" id="id-2-khoi-tao-controller-creating-the-controller-3"></a>

Bằng lệnh Atisan đơn giản, ta có thể khởi tạo controller `PostController` với nội dung như sau:

```
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class PostController extends Controller
{
    public function create()
    {
        return view('create_post');
    }

    public function store(Request $request)
    {
        // Validate...
    }
}
```

Như bạn thấy, mình đã định nghĩa hai method `create` và `store` tương ứng với hai route ở trên. Tại method `store` tạm thời ta sẽ để trống, lát ta sẽ quay lại viết validation logic sau.

### 3. Khởi tại view (Creating the view) <a href="#id-3-khoi-tai-view-creating-the-view-4" id="id-3-khoi-tai-view-creating-the-view-4"></a>

Theo như ở trên, tiếp theo chúng ta sẽ tạo blade view `create_post`, bạn có thể viết nội dung như sau:

```
<h1>Create new post</h1>
<form action="/post" method="POST">
    @csrf

    <div>
        <p>Title</p>
        <input type="text" name="title">
    </div>
    <div>
        <p>Body</p>
        <textarea name="body" cols="30" rows="10"></textarea>
    </div>
    <br>
    <div>
        <button type="submit">Create</button>
    </div>
</form>
```

Bạn có thể truy cập route `GET /post/create` để xem kết quả.

![](https://images.viblo.asia/5308e8b3-f6b8-4d43-bcad-41ccf5e58265.JPG)

### 4. Viết validation logic (Writing the validation logic) <a href="#id-4-viet-validation-logic-writing-the-validation-logic-5" id="id-4-viet-validation-logic-writing-the-validation-logic-5"></a>

Bây giờ chúng ta đã sẵn sàng viết validation logic trong method `store` của controller `PostController` rồi. Để làm điều này, chúng ta sẽ sử dụng method `validate` được cung cấp bởi `Illuminate\Http\Request` object. Nếu vượt qua xác thực, các dòng code tiếp theo của bạn sẽ được thực thi bình thường; còn nếu không, một lỗi ngoại lệ sẽ được đưa ra và lỗi phản hồi phù hợp sẽ được trả về phái người dùng. Trong trường hợp sử dụng HTTP request, một redirect response sẽ được khởi tạo, trong khi một json response sẽ được gửi về nếu sử dụng AJAX request.

```
public function store(Request $request)
{
    $validatedData = $request->validate([
        'title' => 'required|max:100',
        'body' => 'required|min:50',
    ]);

    // The post is valid...
}
```

Như bạn thấy, mình đã truyền các rule validation vào bên trong method `validate`. Bây giờ mình sẽ giải thích đơn giản.

Sau khi request được gửi đến, dữ liệu sẽ được truyền vào method `validate`, nó sẽ lọc các request có tên trùng với tên các rule validation đã liệt kê trước đó. Trong trường hợp này là request `title` và `body`. Nếu tồn tại nó sẽ tiến hành xác thực, còn không thì sẽ bỏ qua.

Đối với request `title` mình sẽ xác thực hai rule đó là `required` và `max:100`, mỗi rule sẽ ngăn cách nhau bởi ký tự `|`. Với rule `required`, bắt buộc trường `title` phải có trong request và không được bỏ trống. Còn với rule `max:100`, sẽ giới hạn độ dài của trường `title`. Các rule này sẽ được xác thực từ trái sang phải.

Tương tự với trường `body`, ta cũng kiểm tra rule `required`, nhưng với rule `min:50` sẽ bắt buộc độ dài của trường `body` phải lớn hơn hoặc bằng 50.

#### a. Dừng lại khi xác thực đầu tiên thất bại (Stopping on first validation failure) <a href="#a-dung-lai-khi-xac-thuc-dau-tien-that-bai-stopping-on-first-validation-failure-6" id="a-dung-lai-khi-xac-thuc-dau-tien-that-bai-stopping-on-first-validation-failure-6"></a>

Thỉnh thoảng bạn muốn dừng lại việc xác thực rule nếu như thất bại ở rule đầu tiên trong một trường nào đó. Bạn có thể khai báo rule `bail` như thế này:

```
$validatedData = $request->validate([
    'title' => 'bail|required|max:100',
    'body' => 'required|min:50',
]);
```

Như vậy ta có thể hiểu rằng khi trường `title` không tồn tại hoặc trống trong request gửi đến, thì dừng ngay việc validate trường này và chuyển sang trường `body` kế tiếp, tức là rule `max:100` sẽ không được xác thực. Việc này sẽ giúp ta giảm thiểu thời gian xác thực hơn.

#### b. Lưu ý về các thuộc tính lồng nhau (A note on nested attributes) <a href="#b-luu-y-ve-cac-thuoc-tinh-long-nhau-a-note-on-nested-attributes-7" id="b-luu-y-ve-cac-thuoc-tinh-long-nhau-a-note-on-nested-attributes-7"></a>

Thoát ra ví dụ một chút, giả sử HTTP request của bạn có chứa các tham số lồng nhau, bạn có thể chỉ định chúng trong rule validation với ký tự `.`. Chẳng hạn:

```
$request->validate([
    'author.name' => 'required',
    'author.description' => 'required',
]);
```
