Quay lại

Cách validate trong Laravel cho người mới bắt đầu Chuyên mục PHP và Laravel    2023-05-13    315 Lượt xem    104 Lượt thích    comment-3 Created with Sketch Beta. 0 Bình luận

Cách validate trong Laravel cho người mới bắt đầu

Cho đến nay, Laravel là framework PHP phổ biến nhất, do tính linh hoạt rất lớn, cộng đồng tuyệt vời và quá trình phát triển nhanh chóng. Xử lý và xác thực đầu vào của người dùng có lẽ là một trong những điều quan trọng nhất trong Laravel. Trong bài viết này, tôi sẽ chỉ cho bạn ba phương pháp để xác thực đầu vào của người dùng.

Đối với bài viết này, tôi sẽ giả sử bạn đã có một form và hai route như sau:

use App\Http\Controllers\PostController;
 
Route::get('/post/create', [PostController::class, 'create']);
Route::post('/post', [PostController::class, 'store']);

Nguyên tắc chính đằng sau quá trình xác thực rất đơn giản: bạn lấy một số đầu vào, bạn xác định một số quy tắc để kiểm tra đầu vào và trình xác thực kiểm tra xem các quy tắc có áp dụng cho đầu vào hay không. Nếu không, nó sẽ cung cấp cho bạn (các) thông báo lỗi thích hợp. Tùy thuộc vào phương pháp bạn sử dụng, thông báo lỗi có thể được tự động trả về cho người dùng hoặc bạn có thể thực hiện việc đó theo cách thủ công.

Nếu đầu vào hợp lệ, nó sẽ tự động tiến hành như bình thường. Điều này giúp bạn dễ dàng chỉ cần đặt xác thực trước hầu hết mọi đầu vào – đồng thời ngăn ngừa lỗi và những điều kỳ lạ trong tương lai.

Cách 1: $request->validate()

Phương thức đầu tiên là phương thức có thể áp dụng ngay lập tức theo request: $request->validate($rules). Trong controller của bạn, ví dụ:

use Illuminate\Http\Request;
 
public function store(Request $request): mixed
{
    $validated = $request->validate([
        'title' => 'required|unique:posts|max:255',
        'body' => 'required',
    ]);
 
    // The input is valid...
}

Các bước sẽ thực hiện như sau:

  1. Chúng ta lấy đầu vào trong biến $request.
  2. Chúng ta áp dụng phương thức validate() trên nó ($request->validate()).
  3. Đầu ra được lưu trong biến $validated.

Điều gì xảy ra khi trình xác thực không thành công?

Nếu trình xác thực không thành công, Laravel sẽ tự động chuyển hướng đến trang trước đó. Trên trang đó, Laravel chèn biến $errors. Bạn có thể sử dụng biến này để hiển thị lỗi:

<!-- /resources/views/post/create.blade.php -->
 
<h1>Create Post</h1>
 
@if ($errors->any())
    <div class="alert alert-danger">
        <ul>
            @foreach ($errors->all() as $error)
                <li>{{ $error }}</li>
            @endforeach
        </ul>
    </div>
@endif
 
<!-- Create Post Form -->

Nếu bạn muốn tùy chỉnh các thông báo lỗi Xác thực, trên tài liệu của laravel có đề cập như sau:

Mỗi quy tắc xác thực tích hợp sẵn của Laravel đều có một thông báo lỗi nằm trong tệp resources/lang/en/validation.php của ứng dụng của bạn. Trong tệp này, bạn sẽ tìm thấy mục nhập bản dịch cho từng quy tắc xác thực. Bạn có thể tự do thay đổi hoặc sửa đổi các thông báo này dựa trên nhu cầu của ứng dụng của bạn.

Điều gì xảy ra nếu trình xác thực thành công?

Nếu trình xác thực thành công, nó sẽ chuyển sang bước tiếp theo trong controller.

Cách 2: Laravel Form Requests

Nếu bạn phải xử lý nhiều thông tin đầu vào của người dùng, có thể hữu ích khi đặt tất cả logic xác thực ở một nơi. Nếu bạn đã đọc ví dụ trên, bạn sẽ sớm thấy mình rơi vào tình huống mà mọi controller đều lộn xộn với các quy tắc xác thực. May mắn thay, Laravel có một giải pháp cho điều đó: Form request.

Form request là một class riêng biệt. Nếu bạn tạo form request cho từng biểu mẫu, bạn sẽ sắp xếp ứng dụng của mình tốt hơn nhiều vì tất cả logic đều ở một nơi. Nó cũng cho phép bạn sử dụng lại các quy tắc xác thực mà không phải lặp lại chúng, ví dụ: trong hai controllers. Khi bạn muốn sử dụng nó trong controller của mình, bạn sẽ sử dụng một phiên bản của form request thay vì một phiên bản của Yêu cầu $request 'thông thường'.

Để tạo Form request, hãy chạy lệnh Artisan sau từ thư mục dự án của bạn:

php artisan make:request StorePostRequest

Request sẽ được đặt trong tệp sau: app/Http/Requests/StorePostRequest.php. Tệp này bao gồm hai phương thức: rules ()authorize ()

Form Request: the rules() method

Phương thức rules() là phương thức đơn giản hơn trong cả hai: nó chỉ là một hàm xác định các quy tắc xác thực để kiểm tra. Phương thức này rất đơn giản vì nó chỉ trả về một mảng với quy tắc:

public function rules(): array
{
    return [
        'title' => 'required|unique:posts|max:255',
        'body' => 'required',
    ];
}

Form Request: the authorize() method

Phương thức authorize () là chức năng thứ hai trong form request của bạn. Hàm này sẽ trả về giá trị boolean (true/false). Tóm lại, bạn có thể thực hiện một số loại kiểm tra xem người dùng có được phép gửi biểu mẫu này hay không. 

public function authorize(): bool
{
    /* Retrieve the comment that the user wants to update */
    $comment = Comment::find($this->route('comment'));
 
    /* Check if the comment exists and if the user is allowed to update this particular comment. If you want to learn more about the user()->can() method, you should checkout the Laravel docs on guards and authorization. */
    return $comment && $this->user()->can('update', $comment);
}

Chúng ta sử dụng request form như thế nào?

Sử dụng Form Requests rất đơn giản. Trong controller của bạn, thay vì sử dụng Yêu cầu $request, chúng ta sử dụng StorePostRequest $request.

use \App\Http\Requests\StorePostRequest;
 
public function store(StorePostRequest $request): mixed
{
    // The incoming request is valid...
    // else the Form Request would have returned the error messages and we wouldn't be here then.
 
    // Retrieve the validated input data...
    $validated = $request->validated();
}

Việc hiển thị thông báo lỗi diễn ra theo cách tương tự như với phương pháp 1.

Tùy chỉnh thông báo lỗi trong Form Request

Có một số chức năng khác mà bạn nên biết rằng bạn có thể tùy chọn thêm chúng vào form request của mình. Một trong số đó là hàm messages(). Nó cho phép bạn tùy chỉnh thông báo lỗi trên cơ sở mỗi biểu mẫu chứ không phải cho ứng dụng hoàn chỉnh của bạn cùng một lúc:

public function messages(): array
{
    return [
        'title.required' => 'A title is required',
        'body.required' => 'A message is required',
    ];
}

Cách 3: Validator::make()

Phương pháp thứ ba là tạo thủ công một phiên bản của Trình xác thực Laravel. Thao tác này không tự động chuyển hướng và trả lại thông báo lỗi, nhưng nó cho phép bạn handlecatch chúng theo cách bạn muốn. Nó có nghĩa là bạn có nhiều tự do hơn về cách sử dụng nó. Kiểm tra ví dụ sau:

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
 
public function store(Request $request): mixed
{
    $validator = Validator::make($request->all(), [
        'title' => 'required|unique:posts|max:255',
        'body' => 'required',
    ]);
 
    if ($validator->fails()) {
        // For example:
        return redirect('post/create')
                ->withErrors($validator)
                ->withInput();
 
        // Also handy: get the array with the errors
        $validator->errors();
 
        // or, for APIs:
        $validator->errors()->toJson();
    }
 
    // Input is valid, continue...
}

Xác định các quy tắc

Như bạn đã thấy trong các ví dụ trên, để sử dụng trình xác thực, chúng ta cần xác định các quy tắc. Có rất nhiều quy tắc, nhưng dưới đây tôi liệt kê những quy tắc phổ biến nhất.

Trong các ví dụ của chúng ta ở đây, chúng ta đang sử dụng cú pháp : 'fieldname': 'rule|otherRule|anotherRule'.

Nhưng bạn cũng có thể sử dụng cú pháp mảng: 'fieldname': ['rule', 'otherRule', 'anotherRule'].

Các Validation rules Laravel phổ biến nhất:

Requiring input:

'required', 'required_if':'anotherField,equalToThisValue', 'required_unless':'anotherField,equalToThisValue

Các trường phải có mẫu nhất định:

'email', 'active_url', 'ip'.

Databases (unqiue & existing records):

'exists':'tableName,columnName', 'unique':'tableName,columnName'.

Before or after certain date:

'after':'date', 'before':'date'. chú ý rằng date phải là string bạn có thể dùng hàm strtotime().

Kết luận

Thâtj là đơn giản phải không nào , các bạn có thể sử dụng 1 trong những cách trên để áp dụng cho dự án của mình nhé . Thank you

 

Bình luận (0)

Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough

Bài viết liên quan

Learning English Everyday