[Bài đọc] Bắt đầu nhanh validation

4. Validation, Exception & Cookies

Laravel cung cấp một vài cách tiếp cận để validate dữ liệu đến ứng dụng của bạn. Mặc định, class base controller của Laravel sử dụng ValidatesRequests trait cung cấp phương thức khá thuận tiện cho việc validate HTTP request đến với đa dạng quy định validation.

Xác định routes

Đầu tiên, giả sử chúng ta có route được định nghĩa trong routes/web.php:

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

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

Tất nhiên, phương thức GET route sẽ hiển thị một form cho người dùng tạo mới một bài viết, trong khi phương thức POST route sẽ lưu bài viết đấy vào cơ sở dữ liệu.

Tạo Controller

Tiếp theo, tạo một controller đơn giản xử lý các routes.Bây giờ, chúng ta sẽ để phương thức đấy store rỗng:

<?php

namespace App\Http\Controllers;

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

class PostController extends Controller
{
    /**
     * Show the form to create a new blog post.
     *
     * @return    Response
     */
    public function create()
    {
        return view('post.create');
    }

    /**
     * Store a new blog post.
     *
     * @param        Request  $request
     * @return    Response
     */
    public function store(Request $request)
    {
        // Validate and store the blog post...
    }
}

Viết logic validation

Bây giờ chúng ta đã sẵn sàng viết logic vào phương thức store để validate tạo mới bài viết. Nếu bạn kiểm tra class base controller (App\Http\Controllers\Controller) của Laravel, bạn sẽ thấy class sử dụng một ValidatesRequests trait. nó cung cấp một phương thức validate cho tất cả controllers.

Phương thức validate chấp nhận một HTTP request đến và đặt quy định validation. Nếu quy định validationthành công, code của bạn sẽ thực thi bình thường; tuy nhiên, nếu validation thất bại, mội exception sẽ được ném và tích hợp lỗi response sẽ được tự động gửi cho người dùng. Trong trường hợp là HTTP request, một response chuyển trang sẽ được tạo ra, trong khi một JSON response sẽ được gửi cho AJAX requests.

Để có thể hiểu rõ hơn về phương thức validate , hãy quay lại phương thức store:

/**
 * Store a new blog post.
 *
 * @param        Request  $request
 * @return    Response
 */
public function store(Request $request)
{
    $this->validate($request, [
        'title' => 'required|unique:posts|max:255',
        'body' => 'required',
    ]);

    // The blog post is valid, store in database...
}

Như bạn có thể thấy, chúng ta có thể truyền qua HTTP request đến và yêu cầu quy định validation vào phương thức validate. Một lần nữa, nếu validation thất bại, Một proper response sẽ tự động được tạo ra. Nếu validation thành công, controller sẽ được thực thi bình thường.

Hiển thị validation lỗi

Cái gì sẽ xảy ra khi có một tham số request gửi đến không thành không với quy định validation? Như đã đề cập ở trước, Laravel sẽ tự động chuyển trang lại cho người dùng về trang trước đó. Ngoài ra, tất cả các lỗi validation sẽ tự động flashed vào session.

Một lần nữa, chú ý rằng chúng ta sẽ không có một cách rõ ràng bind nội dung lỗi vào view của GET route. Bời vì Laravel sẽ tự động kiểm tra lỗi trong dữ liệu session, và tự động bind chúng vào view nếu chúng tồn tại. Biến $errors sẽ là một thể hiện của Illuminate\Support\MessageBag

Vì vậy, trong ví dụ trên, người dùng sẽ chuyển trang đến phương thức create của controller khi validation thất bại, cho phép chúng ta hiển thị nội dung lỗi trên view:

<!-- /resources/views/post/create.blade.php -->

<h1>Create Post</h1>

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

<!-- Create Post Form -->

Leave a Reply

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