Laravel: Xác thực (Validation)

Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực

 

Giới thiệu

Laravel cung cấp một số cách tiếp cận khác nhau để xác thực dữ liệu đến của ứng dụng của bạn. Thông thường nhất là sử dụng validatephương thức có sẵn trên tất cả các yêu cầu HTTP đến. Tuy nhiên, chúng ta cũng sẽ thảo luận về các cách tiếp cận khác để xác nhận.

Laravel bao gồm nhiều quy tắc xác thực thuận tiện mà bạn có thể áp dụng cho dữ liệu, thậm chí cung cấp khả năng xác thực nếu các giá trị là duy nhất trong một bảng cơ sở dữ liệu nhất định. Chúng tôi sẽ trình bày chi tiết từng quy tắc xác thực này để bạn làm quen với tất cả các tính năng xác thực của Laravel.

 

Bắt đầu nhanh xác thực

Để tìm hiểu về các tính năng xác thực mạnh mẽ của Laravel, chúng ta hãy xem một ví dụ hoàn chỉnh về xác thực biểu mẫu và hiển thị thông báo lỗi trở lại người dùng. Bằng cách đọc tổng quan cấp cao này, bạn sẽ có thể hiểu rõ chung về cách xác thực dữ liệu yêu cầu đến bằng Laravel:

 

Xác định các tuyến đường

Trước tiên, hãy giả sử chúng ta có các tuyến sau được xác định trong routes/web.phptệp của chúng tôi :

use App\Http\Controllers\PostController;

Route::get('/post/create', [PostController::class, 'create']);
Route::post('/post', [PostController::class, 'store']);

Các GETtuyến đường sẽ hiển thị một hình thức cho người sử dụng để tạo ra một bài đăng blog mới, trong khi POSTtuyến đường sẽ lưu trữ các bài viết trên blog mới trong cơ sở dữ liệu.

 

Tạo bộ điều khiển

Tiếp theo, chúng ta hãy xem xét một bộ điều khiển đơn giản xử lý các yêu cầu gửi đến các tuyến đường này. storeBây giờ chúng ta sẽ để trống phương thức:

<?php

namespace App\Http\Controllers;

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

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

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

 

Viết logic xác thực

Bây giờ chúng tôi đã sẵn sàng điền vào storephương pháp của chúng tôi với logic để xác thực bài đăng blog mới. Để làm điều này, chúng tôi sẽ sử dụng validatephương thức được cung cấp bởi Illuminate\Http\Requestđối tượng. Nếu các quy tắc xác thực được thông qua, mã của bạn sẽ tiếp tục thực thi bình thường; tuy nhiên, nếu xác thực không thành công, một ngoại lệ sẽ được đưa ra và phản hồi lỗi thích hợp sẽ tự động được gửi lại cho người dùng.

Nếu xác thực không thành công trong một yêu cầu HTTP truyền thống, một phản hồi chuyển hướng đến URL trước đó sẽ được tạo. Nếu yêu cầu đến là một yêu cầu XHR, thì một phản hồi JSON chứa các thông báo lỗi xác thực sẽ được trả về.

Để hiểu rõ hơn về validatephương pháp này, hãy quay lại storephương thức:

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

    // The blog post is valid...
}

Như bạn có thể thấy, các quy tắc xác thực được chuyển vào validatephương thức. Đừng lo lắng - tất cả các quy tắc xác thực có sẵn đều được ghi lại . Một lần nữa, nếu xác thực không thành công, phản hồi thích hợp sẽ tự động được tạo. Nếu quá trình xác thực vượt qua, bộ điều khiển của chúng tôi sẽ tiếp tục thực thi bình thường.

Ngoài ra, các quy tắc xác thực có thể được chỉ định dưới dạng các mảng quy tắc thay vì một |chuỗi được phân tách đơn lẻ :

$validatedData = $request->validate([
    'title' => ['required', 'unique:posts', 'max:255'],
    'body' => ['required'],
]);

Ngoài ra, bạn có thể sử dụng validateWithBagphương pháp này để xác thực một yêu cầu và lưu trữ bất kỳ thông báo lỗi nào trong một túi lỗi được đặt tên :

$validatedData = $request->validateWithBag('post', [
    'title' => ['required', 'unique:posts', 'max:255'],
    'body' => ['required'],
]);

 

Dừng khi xác thực lần đầu không thành công

Đôi khi bạn có thể muốn ngừng chạy các quy tắc xác thực trên một thuộc tính sau lần xác thực đầu tiên không thành công. Để làm như vậy, hãy chỉ định bailquy tắc cho thuộc tính:

$request->validate([
    'title' => 'bail|required|unique:posts|max:255',
    'body' => 'required',
]);

Trong ví dụ này, nếu uniquequy tắc trên titlethuộc tính không thành công, maxquy tắc sẽ không được kiểm tra. Các quy tắc sẽ được xác nhận theo thứ tự mà chúng được chỉ định.

 

Lưu ý về các thuộc tính lồng nhau

Nếu yêu cầu HTTP đến chứa dữ liệu trường "lồng nhau", bạn có thể chỉ định các trường này trong quy tắc xác thực của mình bằng cú pháp "chấm":

$request->validate([
    'title' => 'required|unique:posts|max:255',
    'author.name' => 'required',
    'author.description' => 'required',
]);

Mặt khác, nếu tên trường của bạn chứa dấu chấm theo nghĩa đen, bạn có thể ngăn điều này được hiểu rõ ràng là cú pháp "dấu chấm" bằng cách thoát dấu chấm bằng dấu gạch chéo ngược:

$request->validate([
    'title' => 'required|unique:posts|max:255',
    'v1\.0' => 'required',
]);

 

Hiển thị các lỗi xác thực

Vì vậy, điều gì sẽ xảy ra nếu các trường yêu cầu đến không vượt qua các quy tắc xác thực đã cho? Như đã đề cập trước đây, Laravel sẽ tự động chuyển hướng người dùng trở lại vị trí trước đó của họ. Ngoài ra, tất cả các lỗi xác thực và đầu vào yêu cầu sẽ tự động được chuyển sang phiên .

Một $errorsbiến được chia sẻ với tất cả các chế độ xem ứng dụng của bạn bởi Illuminate\View\Middleware\ShareErrorsFromSessionphần mềm trung gian, được cung cấp bởi webnhóm phần mềm trung gian. Khi phần mềm trung gian này được áp dụng, một $errorsbiến sẽ luôn có sẵn trong khung nhìn của bạn, cho phép bạn thuận tiện cho rằng $errorsbiến luôn được xác định và có thể được sử dụng một cách an toàn. Các $errorsbiến sẽ là một thể hiện của Illuminate\Support\MessageBag. Để biết thêm thông tin về cách làm việc với đối tượng này, hãy xem tài liệu của nó .

Vì vậy, trong ví dụ của chúng tôi, người dùng sẽ được chuyển hướng đến createphương thức của bộ điều khiển của chúng tôi khi xác thực không thành công, cho phép chúng tôi hiển thị thông báo lỗi trong chế độ xem:

<!-- /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 -->

 

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

Mỗi quy tắc xác thực tích hợp của Laravel đều có một thông báo lỗi nằm trong resources/lang/en/validation.phptệp ứng dụng của bạn . Trong tệp này, bạn sẽ tìm thấy một mục 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.

Ngoài ra, bạn có thể sao chép tệp này sang một thư mục ngôn ngữ dịch khác để dịch các thông báo cho ngôn ngữ ứng dụng của bạn. Để tìm hiểu thêm về bản địa hóa Laravel, hãy xem toàn bộ tài liệu bản địa hóa .

 

Yêu cầu & xác thực XHR

Trong ví dụ này, chúng tôi đã sử dụng một biểu mẫu truyền thống để gửi dữ liệu đến ứng dụng. Tuy nhiên, nhiều ứng dụng nhận được yêu cầu XHR từ giao diện người dùng hỗ trợ JavaScript. Khi sử dụng validatephương thức trong một yêu cầu XHR, Laravel sẽ không tạo phản hồi chuyển hướng. Thay vào đó, Laravel tạo một phản hồi JSON chứa tất cả các lỗi xác thực. Phản hồi JSON này sẽ được gửi với mã trạng thái 422 HTTP.

 

các @errorChỉ thị

Bạn có thể sử dụng chỉ thị @error Blade để nhanh chóng xác định xem thông báo lỗi xác thực có tồn tại cho một thuộc tính nhất định hay không. Trong một @errorchỉ thị, bạn có thể lặp lại $messagebiến để hiển thị thông báo lỗi:

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

<label for="title">Post Title</label>

<input id="title" type="text" name="title" class="@error('title') is-invalid @enderror">

@error('title')
    <div class="alert alert-danger">{{ $message }}</div>
@enderror

Nếu bạn đang sử dụng các túi lỗi được đặt tên , bạn có thể chuyển tên của túi lỗi làm đối số thứ hai cho @errorchỉ thị:

<input ... class="@error('title', 'post') is-invalid @enderror">

 

Sao chép lại các biểu mẫu

Khi Laravel tạo phản hồi chuyển hướng do lỗi xác thực, khung công tác sẽ tự động chuyển tất cả đầu vào của yêu cầu vào phiên . Điều này được thực hiện để bạn có thể thuận tiện truy cập đầu vào trong lần yêu cầu tiếp theo và tạo lại biểu mẫu mà người dùng đã cố gắng gửi.

Để truy xuất đầu vào đã nhấp nháy từ yêu cầu trước đó, hãy gọi oldphương thức trên một phiên bản của Illuminate\Http\Request. Các oldphương pháp sẽ kéo dữ liệu đầu vào lóe lên trước đó từ các phiên :

$title = $request->old('title');

Laravel cũng cung cấp một trình oldtrợ giúp toàn cầu . Nếu bạn đang hiển thị đầu vào cũ trong mẫu Blade , sẽ thuận tiện hơn khi sử dụng trình oldtrợ giúp để tạo lại biểu mẫu. Nếu không có đầu vào cũ nào tồn tại cho trường đã cho, nullsẽ được trả về:

<input type="text" name="title" value="{{ old('title') }}">

 

Lưu ý về các trường tùy chọn

Theo mặc định, Laravel bao gồm phần mềm trung gian TrimStringsvà ConvertEmptyStringsToNullphần mềm trung gian trong ngăn xếp phần mềm trung gian toàn cầu của ứng dụng của bạn. Các phần mềm trung gian này được liệt kê trong ngăn xếp theo App\Http\Kernellớp. Do đó, bạn thường sẽ cần phải đánh dấu các trường yêu cầu "tùy chọn" của mình như nullablethể bạn không muốn trình xác thực coi nullcác giá trị là không hợp lệ. Ví dụ:

$request->validate([
    'title' => 'required|unique:posts|max:255',
    'body' => 'required',
    'publish_at' => 'nullable|date',
]);

Trong ví dụ này, chúng tôi đang chỉ định rằng publish_attrường có thể là một trong hai nullhoặc một đại diện ngày hợp lệ. Nếu công cụ nullablesửa đổi không được thêm vào định nghĩa quy tắc, trình xác thực sẽ coi nulllà ngày không hợp lệ.

 

Xác thực yêu cầu biểu mẫu

 

Tạo yêu cầu biểu mẫu

Đối với các tình huống xác thực phức tạp hơn, bạn có thể muốn tạo một "yêu cầu biểu mẫu". Yêu cầu biểu mẫu là các lớp yêu cầu tùy chỉnh đóng gói logic xác thực và ủy quyền của riêng chúng. Để tạo một lớp yêu cầu biểu mẫu, bạn có thể sử dụng lệnh make:requestArtisan CLI:

php artisan make:request StorePostRequest

Lớp yêu cầu biểu mẫu đã tạo sẽ được đặt trong app/Http/Requeststhư mục. Nếu thư mục này không tồn tại, nó sẽ được tạo khi bạn chạy make:requestlệnh. Mỗi yêu cầu biểu mẫu do Laravel tạo ra có hai phương thức: authorizevà rules.

Như bạn có thể đoán, authorizephương thức chịu trách nhiệm xác định xem người dùng hiện đang được xác thực có thể thực hiện hành động được đại diện bởi yêu cầu hay không, trong khi rulesphương thức trả về các quy tắc xác thực sẽ áp dụng cho dữ liệu của yêu cầu:

/**
 * Get the validation rules that apply to the request.
 *
 * @return array
 */
public function rules()
{
    return [
        'title' => 'required|unique:posts|max:255',
        'body' => 'required',
    ];
}

 

Bạn có thể nhập gợi ý bất kỳ phụ thuộc nào bạn yêu cầu trong ruleschữ ký của phương pháp. Chúng sẽ tự động được giải quyết thông qua vùng chứa dịch vụ Laravel .

 

Vì vậy, các quy tắc xác nhận được đánh giá như thế nào? Tất cả những gì bạn cần làm là nhập gợi ý yêu cầu trên phương thức bộ điều khiển của bạn. Yêu cầu biểu mẫu đến được xác thực trước khi phương thức bộ điều khiển được gọi, có nghĩa là bạn không cần phải làm lộn xộn bộ điều khiển của mình với bất kỳ logic xác thực nào:

/**
 * Store a new blog post.
 *
 * @param  \App\Http\Requests\StorePostRequest  $request
 * @return Illuminate\Http\Response
 */
public function store(StorePostRequest $request)
{
    // The incoming request is valid...

    // Retrieve the validated input data...
    $validated = $request->validated();

    // Retrieve a portion of the validated input data...
    $validated = $request->safe()->only(['name', 'email']);
    $validated = $request->safe()->except(['name', 'email']);
}

Nếu xác thực không thành công, một phản hồi chuyển hướng sẽ được tạo để đưa người dùng trở lại vị trí trước đó của họ. Các lỗi cũng sẽ được hiển thị trong phiên để chúng có sẵn để hiển thị. Nếu yêu cầu là một yêu cầu XHR, phản hồi HTTP với mã trạng thái 422 sẽ được trả lại cho người dùng bao gồm cả biểu diễn JSON về các lỗi xác thực.

 

Thêm sau hooks vào biểu mẫu yêu cầu

Nếu bạn muốn thêm móc xác thực "sau" vào yêu cầu biểu mẫu, bạn có thể sử dụng withValidatorphương pháp này. Phương thức này nhận trình xác thực được xây dựng đầy đủ, cho phép bạn gọi bất kỳ phương thức nào của nó trước khi các quy tắc xác thực thực sự được đánh giá:

/**
 * Configure the validator instance.
 *
 * @param  \Illuminate\Validation\Validator  $validator
 * @return void
 */
public function withValidator($validator)
{
    $validator->after(function ($validator) {
        if ($this->somethingElseIsInvalid()) {
            $validator->errors()->add('field', 'Something is wrong with this field!');
        }
    });
}

 

Dừng trên thuộc tính lỗi xác thực đầu tiên

Bằng cách thêm một thuộc stopOnFirstFailuretính vào lớp yêu cầu của mình, bạn có thể thông báo cho trình xác thực rằng nó sẽ ngừng xác thực tất cả các thuộc tính sau khi một lỗi xác thực xảy ra:

/**
 * Indicates if the validator should stop on the first rule failure.
 *
 * @var bool
 */
protected $stopOnFirstFailure = true;

 

Ủy quyền yêu cầu biểu mẫu

Lớp yêu cầu biểu mẫu cũng chứa một authorizephương thức. Trong phương pháp này, bạn có thể xác định xem người dùng được xác thực có thực sự có quyền cập nhật một tài nguyên nhất định hay không. Ví dụ: bạn có thể xác định xem người dùng có thực sự sở hữu một nhận xét blog mà họ đang cố gắng cập nhật hay không. Rất có thể, bạn sẽ tương tác với các cổng và chính sách ủy quyền của mình trong phương pháp này:

use App\Models\Comment;

/**
 * Determine if the user is authorized to make this request.
 *
 * @return bool
 */
public function authorize()
{
    $comment = Comment::find($this->route('comment'));

    return $comment && $this->user()->can('update', $comment);
}

Vì tất cả các yêu cầu biểu mẫu đều mở rộng lớp yêu cầu Laravel cơ sở, chúng tôi có thể sử dụng userphương thức này để truy cập người dùng hiện đã được xác thực. Ngoài ra, hãy lưu ý lệnh gọi routephương thức trong ví dụ trên. Phương thức này cấp cho bạn quyền truy cập vào các tham số URI được xác định trên tuyến đường đang được gọi, chẳng hạn như {comment}tham số trong ví dụ bên dưới:

Route::post('/comment/{comment}');

Do đó, nếu ứng dụng của bạn đang tận dụng ràng buộc mô hình tuyến , mã của bạn có thể được làm ngắn gọn hơn nữa bằng cách truy cập mô hình đã phân giải dưới dạng thuộc tính của yêu cầu:

return $this->user()->can('update', $this->comment);

Nếu authorizephương thức trả về false, phản hồi HTTP có mã trạng thái 403 sẽ tự động được trả về và phương thức bộ điều khiển của bạn sẽ không thực thi.

Nếu bạn định xử lý logic ủy quyền cho yêu cầu trong một phần khác của ứng dụng của mình, bạn có thể chỉ cần quay lại truetừ authorizephương thức:

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

 

Bạn có thể nhập gợi ý bất kỳ phụ thuộc nào bạn cần trong authorizechữ ký của phương thức. Chúng sẽ tự động được giải quyết thông qua vùng chứa dịch vụ Laravel .

 

 

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

Bạn có thể tùy chỉnh các thông báo lỗi được sử dụng bởi yêu cầu biểu mẫu bằng cách ghi đè messagesphương thức. Phương thức này sẽ trả về một mảng các cặp thuộc tính / quy tắc và các thông báo lỗi tương ứng của chúng:

/**
 * Get the error messages for the defined validation rules.
 *
 * @return array
 */
public function messages()
{
    return [
        'title.required' => 'A title is required',
        'body.required' => 'A message is required',
    ];
}

 

Tùy chỉnh các thuộc tính xác thực

Nhiều thông báo lỗi quy tắc xác thực tích hợp của Laravel có chứa :attributetrình giữ chỗ. Nếu bạn muốn :attributetrình giữ chỗ của thông báo xác thực của mình được thay thế bằng tên thuộc tính tùy chỉnh, bạn có thể chỉ định các tên tùy chỉnh bằng cách ghi đè attributesphương thức. Phương thức này sẽ trả về một mảng các cặp thuộc tính / tên:

/**
 * Get custom attributes for validator errors.
 *
 * @return array
 */
public function attributes()
{
    return [
        'email' => 'email address',
    ];
}

 

Chuẩn bị đầu vào để xác thực

Nếu bạn cần chuẩn bị hoặc khử trùng bất kỳ dữ liệu nào từ yêu cầu trước khi áp dụng các quy tắc xác thực của mình, bạn có thể sử dụng prepareForValidationphương pháp:

use Illuminate\Support\Str;

/**
 * Prepare the data for validation.
 *
 * @return void
 */
protected function prepareForValidation()
{
    $this->merge([
        'slug' => Str::slug($this->slug),
    ]);
}

 

Tạo trình xác thực theo cách thủ công

Nếu bạn không muốn sử dụng validatephương thức theo yêu cầu, bạn có thể tạo một thể hiện trình xác thực theo cách thủ công bằng cách sử dụng Validator mặt tiền . Các makephương pháp trên mặt tiền tạo ra một trường hợp validator mới:

<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;

class PostController extends Controller
{
    /**
     * Store a new blog post.
     *
     * @param  Request  $request
     * @return Response
     */
    public function store(Request $request)
    {
        $validator = Validator::make($request->all(), [
            'title' => 'required|unique:posts|max:255',
            'body' => 'required',
        ]);

        if ($validator->fails()) {
            return redirect('post/create')
                        ->withErrors($validator)
                        ->withInput();
        }

        // Retrieve the validated input...
        $validated = $validator->validated();

        // Retrieve a portion of the validated input...
        $validated = $validator->safe()->only(['name', 'email']);
        $validated = $validator->safe()->except(['name', 'email']);

        // Store the blog post...
    }
}

Đối số đầu tiên được truyền cho makephương thức là dữ liệu đang được xác thực. Đối số thứ hai là một mảng các quy tắc xác thực sẽ được áp dụng cho dữ liệu.

Sau khi xác định xem việc xác thực yêu cầu có thất bại hay không, bạn có thể sử dụng withErrorsphương pháp này để hiển thị thông báo lỗi cho phiên. Khi sử dụng phương pháp này, $errorsbiến sẽ tự động được chia sẻ với các chế độ xem của bạn sau khi chuyển hướng, cho phép bạn dễ dàng hiển thị lại cho người dùng. Các withErrorsphương pháp chấp nhận một validator, một MessageBag, hoặc một PHP array.

Dừng khi xác thực lần đầu không thành công

Các stopOnFirstFailurephương pháp sẽ thông báo xác nhận rằng nó nên dừng lại xác nhận tất cả các thuộc tính một lần thất bại xác nhận đơn đã xảy ra:

if ($validator->stopOnFirstFailure()->fails()) {
    // ...
}

 

Chuyển hướng tự động

Nếu bạn muốn tạo một phiên bản trình xác thực theo cách thủ công nhưng vẫn tận dụng được tính năng chuyển hướng tự động được cung cấp bởi validatephương thức của yêu cầu HTTP , bạn có thể gọi validatephương thức trên một phiên bản trình xác thực hiện có. Nếu xác thực không thành công, người dùng sẽ tự động được chuyển hướng hoặc trong trường hợp có yêu cầu XHR, phản hồi JSON sẽ được trả lại:

Validator::make($request->all(), [
    'title' => 'required|unique:posts|max:255',
    'body' => 'required',
])->validate();

Bạn có thể sử dụng validateWithBagphương pháp để lưu trữ các thông báo lỗi trong một túi lỗi được đặt tên nếu quá trình xác thực không thành công:

Validator::make($request->all(), [
    'title' => 'required|unique:posts|max:255',
    'body' => 'required',
])->validateWithBag('post');

 

Túi lỗi được đặt tên

Nếu bạn có nhiều biểu mẫu trên một trang, bạn có thể đặt tên cho biểu mẫu MessageBagchứa lỗi xác thực, cho phép bạn truy xuất thông báo lỗi cho một biểu mẫu cụ thể. Để đạt được điều này, hãy chuyển một tên làm đối số thứ hai cho withErrors:

return redirect('register')->withErrors($validator, 'login');

Sau đó, bạn có thể truy cập phiên bản đã đặt tên MessageBagtừ $errorsbiến:

{{ $errors->login->first('email') }}

 

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

Nếu cần, bạn có thể cung cấp các thông báo lỗi tùy chỉnh mà một phiên bản trình xác thực sẽ sử dụng thay vì các thông báo lỗi mặc định do Laravel cung cấp. Có một số cách để chỉ định thông báo tùy chỉnh. Đầu tiên, bạn có thể chuyển các thông báo tùy chỉnh làm đối số thứ ba cho Validator::makephương thức:

$validator = Validator::make($input, $rules, $messages = [
    'required' => 'The :attribute field is required.',
]);

Trong ví dụ này, :attributetrình giữ chỗ sẽ được thay thế bằng tên thực của trường đang được xác thực. Bạn cũng có thể sử dụng các trình giữ chỗ khác trong các thông báo xác thực. Ví dụ:

$messages = [
    'same' => 'The :attribute and :other must match.',
    'size' => 'The :attribute must be exactly :size.',
    'between' => 'The :attribute value :input is not between :min - :max.',
    'in' => 'The :attribute must be one of the following types: :values',
];

 

Chỉ định một thông báo tùy chỉnh cho một thuộc tính nhất định

Đôi khi bạn có thể chỉ muốn chỉ định một thông báo lỗi tùy chỉnh cho một thuộc tính cụ thể. Bạn có thể làm như vậy bằng cách sử dụng ký hiệu "dấu chấm". Chỉ định tên của thuộc tính trước, sau đó là quy tắc:

$messages = [
    'email.required' => 'We need to know your email address!',
];

 

Chỉ định giá trị thuộc tính tùy chỉnh

Nhiều thông báo lỗi tích hợp sẵn của Laravel bao gồm một :attributetrình giữ chỗ được thay thế bằng tên của trường hoặc thuộc tính đang được xác thực. Để tùy chỉnh các giá trị được sử dụng để thay thế các trình giữ chỗ này cho các trường cụ thể, bạn có thể chuyển một mảng thuộc tính tùy chỉnh làm đối số thứ tư cho Validator::makephương thức:

$validator = Validator::make($input, $rules, $messages, [
    'email' => 'email address',
]);

 

Móc sau khi xác thực

Bạn cũng có thể đính kèm các lệnh gọi lại sẽ được chạy sau khi xác thực xong. Điều này cho phép bạn dễ dàng thực hiện xác nhận thêm và thậm chí thêm nhiều thông báo lỗi hơn vào bộ sưu tập thông báo. Để bắt đầu, hãy gọi afterphương thức trên một phiên bản trình xác thực:

$validator = Validator::make(...);

$validator->after(function ($validator) {
    if ($this->somethingElseIsInvalid()) {
        $validator->errors()->add(
            'field', 'Something is wrong with this field!'
        );
    }
});

if ($validator->fails()) {
    //
}

 

Làm việc với đầu vào đã được xác thực

Sau khi xác thực dữ liệu yêu cầu đến bằng yêu cầu biểu mẫu hoặc phiên bản trình xác thực được tạo thủ công, bạn có thể muốn truy xuất dữ liệu yêu cầu đến đã thực sự trải qua quá trình xác thực. Điều này có thể được thực hiện theo một số cách. Đầu tiên, bạn có thể gọi validatedphương thức trên một yêu cầu biểu mẫu hoặc phiên bản trình xác thực. Phương thức này trả về một mảng dữ liệu đã được xác thực:

$validated = $request->validated();

$validated = $validator->validated();

Ngoài ra, bạn có thể gọi safephương thức trên một yêu cầu biểu mẫu hoặc phiên bản trình xác thực. Phương thức này trả về một thể hiện của Illuminate\Support\ValidatedInput. Đối tượng này phơi bày onlyexceptvà allcác phương pháp để lấy một tập hợp con của dữ liệu xác nhận hoặc toàn bộ mảng dữ liệu xác nhận:

$validated = $request->safe()->only(['name', 'email']);

$validated = $request->safe()->except(['name', 'email']);

$validated = $request->safe()->all();

Ngoài ra, Illuminate\Support\ValidatedInputphiên bản có thể được lặp lại và được truy cập giống như một mảng:

// Validated data may be iterated...
foreach ($request->safe() as $key => $value) {
    //
}

// Validated data may be accessed as an array...
$validated = $request->safe();

$email = $validated['email'];

Nếu bạn muốn truy xuất dữ liệu đã được xác thực dưới dạng một phiên bản bộ sưu tập , bạn có thể gọi collectphương thức:

$collection = $request->safe()->collect();

 

Làm việc với thông báo lỗi

Sau khi gọi errorsphương thức trên một Validatorphiên bản, bạn sẽ nhận được một Illuminate\Support\MessageBagphiên bản, có nhiều phương thức thuận tiện để làm việc với các thông báo lỗi. Các $errorsbiến được tự động tạo sẵn cho tất cả các quan điểm cũng là một thể hiện của MessageBaglớp.

 

Truy xuất thông báo lỗi đầu tiên cho một trường

Để truy xuất thông báo lỗi đầu tiên cho một trường nhất định, hãy sử dụng firstphương pháp:

$errors = $validator->errors();

echo $errors->first('email');

 

Truy xuất tất cả các thông báo lỗi cho một trường

Nếu bạn cần truy xuất một mảng tất cả các thông báo cho một trường nhất định, hãy sử dụng getphương pháp:

foreach ($errors->get('email') as $message) {
    //
}

Nếu bạn đang xác thực một trường biểu mẫu mảng, bạn có thể truy xuất tất cả các thông báo cho từng phần tử mảng bằng cách sử dụng *ký tự:

foreach ($errors->get('attachments.*') as $message) {
    //
}

 

Truy xuất tất cả các thông báo lỗi cho tất cả các trường

Để truy xuất một mảng tất cả các thông báo cho tất cả các trường, hãy sử dụng allphương pháp:

foreach ($errors->all() as $message) {
    //
}

 

Xác định xem thông báo có tồn tại cho một trường hay không

Các hasphương pháp có thể được sử dụng để xác định xem bất kỳ thông báo lỗi tồn tại trong một lĩnh vực nhất định:

if ($errors->has('email')) {
    //
}

 

Chỉ định thông báo tùy chỉnh trong tệp ngôn ngữ

Mỗi quy tắc xác thực tích hợp của Laravel đều có một thông báo lỗi nằm trong resources/lang/en/validation.phptệp ứng dụng của bạn . Trong tệp này, bạn sẽ tìm thấy một mục 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.

Ngoài ra, bạn có thể sao chép tệp này sang một thư mục ngôn ngữ dịch khác để dịch các thông báo cho ngôn ngữ ứng dụng của bạn. Để tìm hiểu thêm về bản địa hóa Laravel, hãy xem toàn bộ tài liệu bản địa hóa .

 

Thông báo tùy chỉnh cho các thuộc tính cụ thể

Bạn có thể tùy chỉnh các thông báo lỗi được sử dụng cho các kết hợp thuộc tính và quy tắc được chỉ định trong các tệp ngôn ngữ xác thực ứng dụng của bạn. Để làm như vậy, hãy thêm các tùy chỉnh tin nhắn của bạn vào custommảng resources/lang/xx/validation.phptệp ngôn ngữ của ứng dụng của bạn :

'custom' => [
    'email' => [
        'required' => 'We need to know your email address!',
        'max' => 'Your email address is too long!'
    ],
],

 

Chỉ định các thuộc tính trong tệp ngôn ngữ

Nhiều thông báo lỗi tích hợp sẵn của Laravel bao gồm một :attributetrình giữ chỗ được thay thế bằng tên của trường hoặc thuộc tính đang được xác thực. Nếu bạn muốn :attributephần thông báo xác thực của mình được thay thế bằng giá trị tùy chỉnh, bạn có thể chỉ định tên thuộc tính tùy chỉnh trong attributesmảng của resources/lang/xx/validation.phptệp ngôn ngữ của mình :

'attributes' => [
    'email' => 'email address',
],

 

Chỉ định giá trị trong tệp ngôn ngữ

Một số thông báo lỗi quy tắc xác thực tích hợp sẵn của Laravel chứa :valuetrình giữ chỗ được thay thế bằng giá trị hiện tại của thuộc tính yêu cầu. Tuy nhiên, đôi khi bạn có thể cần :valuephần thông báo xác thực của mình được thay thế bằng phần trình bày giá trị tùy chỉnh. Ví dụ: hãy xem xét quy tắc sau chỉ định rằng số thẻ tín dụng là bắt buộc nếu số payment_typenày có giá trị là cc:

Validator::make($request->all(), [
    'credit_card_number' => 'required_if:payment_type,cc'
]);

Nếu quy tắc xác thực này không thành công, nó sẽ tạo ra thông báo lỗi sau:

The credit card number field is required when payment type is cc.

Thay vì hiển thị ccdưới dạng giá trị loại thanh toán, bạn có thể chỉ định biểu diễn giá trị thân thiện với người dùng hơn trong resources/lang/xx/validation.phptệp ngôn ngữ của mình bằng cách xác định một valuesmảng:

'values' => [
    'payment_type' => [
        'cc' => 'credit card'
    ],
],

Sau khi xác định giá trị này, quy tắc xác thực sẽ tạo ra thông báo lỗi sau:

The credit card number field is required when payment type is credit card.

 

Quy tắc xác thực có sẵn

Dưới đây là danh sách tất cả các quy tắc xác thực có sẵn và chức năng của chúng:

 

Đã được chấp nhận

Các lĩnh vực được thẩm định phải có "yes""on"1, hoặc true. Điều này rất hữu ích để xác thực việc chấp nhận "Điều khoản dịch vụ" hoặc các trường tương tự.

 

accept_if: trường khác, giá trị, ...

Các lĩnh vực được thẩm định phải có "yes""on"1, hoặc truenếu một lĩnh vực được thẩm định bằng một giá trị xác định. Điều này rất hữu ích để xác thực việc chấp nhận "Điều khoản dịch vụ" hoặc các trường tương tự.

 

active_url

Trường được xác thực phải có bản ghi A hoặc AAAA hợp lệ theo dns_get_recordhàm PHP. Tên máy chủ của URL đã cung cấp được trích xuất bằng parse_urlhàm PHP trước khi được chuyển đến dns_get_record.

 

sau: ngày

Trường được xác thực phải là một giá trị sau một ngày nhất định. Ngày tháng sẽ được chuyển vào strtotimehàm PHP để được chuyển đổi thành một phiên bản hợp lệ DateTime:

'start_date' => 'required|date|after:tomorrow'

Thay vì chuyển một chuỗi ngày tháng để đánh giá strtotime, bạn có thể chỉ định một trường khác để so sánh với ngày tháng:

'finish_date' => 'required|date|after:start_date'

 

after_or_equal: ngày tháng

Trường được xác thực phải là một giá trị sau hoặc bằng ngày đã cho. Để biết thêm thông tin, hãy xem quy tắc sau .

 

alpha

Trường được xác thực phải hoàn toàn là các ký tự chữ cái.

 

alpha_dash

Trường được xác thực có thể có các ký tự chữ-số, cũng như dấu gạch ngang và dấu gạch dưới.

 

alpha_num

Trường được xác thực phải hoàn toàn là các ký tự chữ và số.

 

mảng

Trường được xác thực phải là PHP array.

Khi các giá trị bổ sung được cung cấp cho arrayquy tắc, mỗi khóa trong mảng đầu vào phải có trong danh sách các giá trị được cung cấp cho quy tắc. Trong ví dụ sau, adminkhóa trong mảng đầu vào không hợp lệ vì nó không có trong danh sách các giá trị được cung cấp cho arrayquy tắc:

use Illuminate\Support\Facades\Validator;

$input = [
    'user' => [
        'name' => 'Taylor Otwell',
        'username' => 'taylorotwell',
        'admin' => true,
    ],
];

Validator::make($input, [
    'user' => 'array:username,locale',
]);

Nói chung, bạn phải luôn chỉ định các khóa mảng được phép hiện diện trong mảng của bạn. Nếu không, trình xác thực validatevà validatedcác phương thức sẽ trả về tất cả dữ liệu đã được xác thực, bao gồm mảng và tất cả các khóa của nó, ngay cả khi các khóa đó không được xác thực bởi các quy tắc xác thực mảng lồng nhau khác.

Nếu muốn, bạn có thể hướng dẫn trình xác thực của Laravel không bao giờ bao gồm các khóa mảng chưa được xác thực trong dữ liệu "đã được xác thực" mà nó trả về, ngay cả khi bạn sử dụng arrayquy tắc mà không chỉ định danh sách các khóa được phép. Để thực hiện điều này, bạn có thể gọi excludeUnvalidatedArrayKeysphương thức của trình xác thực trong bootphương thức của ứng dụng của bạn AppServiceProvider. Sau khi làm như vậy, trình xác thực sẽ bao gồm các khóa mảng trong dữ liệu "đã được xác thực", nó chỉ trả về khi các khóa đó đã được xác thực cụ thể bởi các quy tắc mảng lồng nhau :

use Illuminate\Support\Facades\Validator;

/**
 * Register any application services.
 *
 * @return void
 */
public function boot()
{
    Validator::excludeUnvalidatedArrayKeys();
}

 

tiền bảo lãnh

Dừng chạy các quy tắc xác thực cho trường sau lần xác thực đầu tiên không thành công.

Mặc dù bailquy tắc sẽ chỉ dừng xác thực một trường cụ thể khi nó gặp lỗi xác thực, nhưng stopOnFirstFailurephương thức sẽ thông báo cho trình xác thực rằng nó sẽ ngừng xác thực tất cả các thuộc tính sau khi một lỗi xác thực xảy ra:

if ($validator->stopOnFirstFailure()->fails()) {
    // ...
}

 

trước: ngày

Trường được xác thực phải là một giá trị trước ngày nhất định. Ngày tháng sẽ được chuyển vào strtotimehàm PHP để được chuyển đổi thành một phiên bản hợp lệ DateTime. Ngoài ra, giống như afterquy tắc, tên của một trường khác đang được xác thực có thể được cung cấp dưới dạng giá trị của date.

 

before_or_equal: date

Trường được xác thực phải là một giá trị trước hoặc bằng ngày đã cho. Ngày tháng sẽ được chuyển vào strtotimehàm PHP để được chuyển đổi thành một phiên bản hợp lệ DateTime. Ngoài ra, giống như afterquy tắc, tên của một trường khác đang được xác thực có thể được cung cấp dưới dạng giá trị của date.

 

giữa: tối thiểu , tối đa

Trường được xác thực phải có kích thước giữa giá trị tối thiểu và tối đa đã cho . Chuỗi, số, mảng và tệp được đánh giá theo cùng một kiểu như sizequy tắc.

 

boolean

Trường được xác thực phải có thể được truyền dưới dạng boolean. Đầu vào được chấp nhận là truefalse10"1", và "0".

 

đã xác nhận

Trường được xác thực phải có trường phù hợp với {field}_confirmation. Ví dụ: nếu là trường được xác thực password, thì password_confirmationtrường khớp phải có trong đầu vào.

 

mật khẩu hiện tại

Trường được xác thực phải khớp với mật khẩu của người dùng đã xác thực. Bạn có thể chỉ định một trình bảo vệ xác thực bằng cách sử dụng tham số đầu tiên của quy tắc:

'password' => 'current_password:api'

 

ngày

Trường được xác thực phải là một ngày hợp lệ, không tương đối theo strtotimehàm PHP.

 

date_equals: ngày

Trường được xác thực phải bằng với ngày đã cho. Ngày tháng sẽ được chuyển vào strtotimehàm PHP để được chuyển đổi thành một phiên bản hợp lệ DateTime.

 

date_format: định dạng

Trường được xác thực phải phù hợp với định dạng đã cho . Bạn nên sử dụng một trong hai date hoặc date_formatkhi xác thực một trường, không phải cả hai. Quy tắc xác thực này hỗ trợ tất cả các định dạng được hỗ trợ bởi lớp DateTime của PHP .

 

khác nhau: lĩnh vực

Trường được xác thực phải có giá trị khác với trường .

 

chữ số: giá trị

Trường được xác thực phải là trường số và phải có độ dài chính xác của giá trị .

 

digit_between: tối thiểu , tối đa

Trường được xác thực phải là trường số và phải có độ dài giữa giá trị tối thiểu và tối đa đã cho .

 

kích thước

Tệp được xác thực phải là một hình ảnh đáp ứng các ràng buộc về kích thước như được chỉ định bởi các tham số của quy tắc:

'avatar' => 'dimensions:min_width=100,min_height=200'

Các ràng buộc có sẵn là: min_width , max_width , min_height , max_height , width , height , ratio .

Một tỷ lệ hạn chế nên được biểu diễn dưới dạng chiều rộng chia cho chiều cao. Điều này có thể được chỉ định bởi một phân số như 3/2hoặc một float như 1.5:

'avatar' => 'dimensions:ratio=3/2'

Vì quy tắc này yêu cầu một số đối số, bạn có thể sử dụng Rule::dimensionsphương pháp này để xây dựng quy tắc một cách trôi chảy:

use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;

Validator::make($data, [
    'avatar' => [
        'required',
        Rule::dimensions()->maxWidth(1000)->maxHeight(500)->ratio(3 / 2),
    ],
]);

 

riêng biệt

Khi xác thực mảng, trường được xác thực không được có bất kỳ giá trị trùng lặp nào:

'foo.*.id' => 'distinct'

Distinction sử dụng so sánh biến lỏng theo mặc định. Để sử dụng so sánh chặt chẽ, bạn có thể thêm stricttham số vào định nghĩa quy tắc xác thực của mình:

'foo.*.id' => 'distinct:strict'

Bạn có thể thêm ignore_casevào các đối số của quy tắc xác thực để làm cho quy tắc bỏ qua sự khác biệt về cách viết hoa:

'foo.*.id' => 'distinct:ignore_case'

 

e-mail

Trường được xác thực phải được định dạng dưới dạng địa chỉ email. Quy tắc xác thực này sử dụng egulias/email-validatorgói để xác thực địa chỉ email. Theo mặc định, RFCValidationtrình xác thực được áp dụng, nhưng bạn cũng có thể áp dụng các kiểu xác thực khác:

'email' => 'email:rfc,dns'

Ví dụ trên sẽ áp dụng các xác nhận RFCValidationvà DNSCheckValidation. Dưới đây là danh sách đầy đủ các kiểu xác thực mà bạn có thể áp dụng:

  • rfcRFCValidation
  • strictNoRFCWarningsValidation
  • dnsDNSCheckValidation
  • spoofSpoofCheckValidation
  • filterFilterEmailValidation

Các filtervalidator, trong đó sử dụng PHP filter_varchức năng, tàu với Laravel và là hành vi xác nhận email mặc định Laravel của trước Laravel phiên bản 5.8.

 

Các dnsvà spoofxác nhận yêu cầu PHP intlmở rộng.

 

 

end_with: foo , bar , ...

Trường được xác thực phải kết thúc bằng một trong các giá trị đã cho.

 

loại trừ

Trường được xác thực sẽ bị loại trừ khỏi dữ liệu yêu cầu được trả về bởi các phương thức validatevà validated.

 

lude_if: anotherfield , value

Các lĩnh vực được thẩm định sẽ bị loại khỏi các dữ liệu yêu cầu được trả về bởi các validatevà validatedphương pháp nếu anotherfield lĩnh vực tương đương với giá trị .

 

lude_unless: anotherfield , value

Các lĩnh vực được thẩm định sẽ bị loại khỏi các dữ liệu yêu cầu được trả về bởi các validatevà validatedphương pháp trừ khi anotherfield trường 's tương đương với giá trị . Nếu giá trị là nullexclude_unless:name,null), trường được xác thực sẽ bị loại trừ trừ khi trường so sánh là nullhoặc trường so sánh bị thiếu trong dữ liệu yêu cầu.

 

tồn tại: bảng , cột

Trường được xác thực phải tồn tại trong một bảng cơ sở dữ liệu nhất định.

 

Cách sử dụng cơ bản của quy tắc tồn tại

'state' => 'exists:states'

Nếu columntùy chọn không được chỉ định, tên trường sẽ được sử dụng. Vì vậy, trong trường hợp này, quy tắc sẽ xác thực rằng statesbảng cơ sở dữ liệu chứa bản ghi có stategiá trị cột khớp với stategiá trị thuộc tính của yêu cầu .

 

Chỉ định tên cột tùy chỉnh

Bạn có thể chỉ định rõ ràng tên cột cơ sở dữ liệu sẽ được sử dụng bởi quy tắc xác thực bằng cách đặt nó sau tên bảng cơ sở dữ liệu:

'state' => 'exists:states,abbreviation'

Đôi khi, bạn có thể cần chỉ định một kết nối cơ sở dữ liệu cụ thể sẽ được sử dụng cho existstruy vấn. Bạn có thể thực hiện điều này bằng cách thêm tên kết nối vào tên bảng:

'email' => 'exists:connection.staff,email'

Thay vì chỉ định trực tiếp tên bảng, bạn có thể chỉ định mô hình Eloquent sẽ được sử dụng để xác định tên bảng:

'user_id' => 'exists:App\Models\User,id'

Nếu bạn muốn tùy chỉnh truy vấn được thực thi bởi quy tắc xác thực, bạn có thể sử dụng Rulelớp để xác định quy tắc một cách thành thạo. Trong ví dụ này, chúng tôi cũng sẽ chỉ định các quy tắc xác thực dưới dạng một mảng thay vì sử dụng |ký tự để phân tách chúng:

use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;

Validator::make($data, [
    'email' => [
        'required',
        Rule::exists('staff')->where(function ($query) {
            return $query->where('account_id', 1);
        }),
    ],
]);

 

tập tin

Trường được xác thực phải là một tệp được tải lên thành công.

 

điền

Trường được xác thực không được để trống khi nó hiện diện.

 

gt: trường

Các lĩnh vực được thẩm định phải lớn hơn cho lĩnh vực . Hai trường phải cùng loại. Chuỗi, số, mảng và tệp được đánh giá bằng cách sử dụng các quy ước giống như sizequy tắc.

 

gte: lĩnh vực

Các lĩnh vực được thẩm định phải lớn hơn hoặc bằng cho lĩnh vực . Hai trường phải cùng loại. Chuỗi, số, mảng và tệp được đánh giá bằng cách sử dụng các quy ước giống như sizequy tắc.

 

hình ảnh

Tệp được xác thực phải là hình ảnh (jpg, jpeg, png, bmp, gif, svg hoặc webp).

 

trong: foo , bar , ...

Trường được xác thực phải được đưa vào danh sách các giá trị đã cho. Vì quy tắc này thường yêu cầu bạn implodemột mảng, nên Rule::inphương pháp này có thể được sử dụng để xây dựng quy tắc một cách trôi chảy:

use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;

Validator::make($data, [
    'zones' => [
        'required',
        Rule::in(['first-zone', 'second-zone']),
    ],
]);

Khi inquy tắc được kết hợp với arrayquy tắc, mỗi giá trị trong mảng đầu vào phải có trong danh sách các giá trị được cung cấp cho inquy tắc. Trong ví dụ sau, LASmã sân bay trong mảng đầu vào không hợp lệ vì nó không có trong danh sách các sân bay được cung cấp cho inquy tắc:

use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;

$input = [
    'airports' => ['NYC', 'LAS'],
];

Validator::make($input, [
    'airports' => [
        'required',
        'array',
        Rule::in(['NYC', 'LIT']),
    ],
]);

 

in_array: anotherfield . *

Các lĩnh vực được thẩm định phải tồn tại trong anotherfield giá trị 's.

 

số nguyên

Trường được xác thực phải là một số nguyên.

 

Quy tắc xác thực này không xác minh rằng đầu vào thuộc loại biến "số nguyên", chỉ rằng đầu vào thuộc loại được chấp nhận bởi FILTER_VALIDATE_INTquy tắc của PHP . Nếu bạn cần phải xác nhận đầu vào như là một số xin vui lòng sử dụng quy tắc này kết hợp với các numericquy tắc xác nhận .

 

 

ip

Trường được xác thực phải là địa chỉ IP.

 

ipv4

Trường được xác thực phải là địa chỉ IPv4.

 

ipv6

Trường được xác thực phải là địa chỉ IPv6.

 

json

Trường được xác thực phải là một chuỗi JSON hợp lệ.

 

lt: trường

Các lĩnh vực được thẩm định phải nhỏ hơn cho lĩnh vực . Hai trường phải cùng loại. Chuỗi, số, mảng và tệp được đánh giá bằng cách sử dụng các quy ước giống như sizequy tắc.

 

lte: lĩnh vực

Các lĩnh vực được thẩm định phải nhỏ hơn hoặc bằng đến cho lĩnh vực . Hai trường phải cùng loại. Chuỗi, số, mảng và tệp được đánh giá bằng cách sử dụng các quy ước giống như sizequy tắc.

 

max: giá trị

Trường được xác thực phải nhỏ hơn hoặc bằng giá trị lớn nhất . Chuỗi, số, mảng và tệp được đánh giá theo cùng một kiểu như sizequy tắc.

 

mimetypes: văn bản / trơn , ...

Tệp đang được xác thực phải khớp với một trong các loại MIME nhất định:

'video' => 'mimetypes:video/avi,video/mpeg,video/quicktime'

Để xác định kiểu MIME của tệp được tải lên, nội dung của tệp sẽ được đọc và khuôn khổ sẽ cố gắng đoán kiểu MIME, có thể khác với kiểu MIME được cung cấp của khách hàng.

 

mimes: foo , bar , ...

Tệp đang được xác thực phải có kiểu MIME tương ứng với một trong các phần mở rộng được liệt kê.

 

Cách sử dụng cơ bản của quy tắc MIME

'photo' => 'mimes:jpg,bmp,png'

Mặc dù bạn chỉ cần chỉ định các phần mở rộng, quy tắc này thực sự xác thực kiểu MIME của tệp bằng cách đọc nội dung của tệp và đoán kiểu MIME của nó. Bạn có thể tìm thấy danh sách đầy đủ các loại MIME và các tiện ích mở rộng tương ứng của chúng tại vị trí sau:

https://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types

 

min: value

Trường được xác thực phải có giá trị tối thiểu . Chuỗi, số, mảng và tệp được đánh giá theo cùng một kiểu như sizequy tắc.

 

multi_of: giá trị

Trường được xác thực phải là một bội số của giá trị .

 

not_in: foo , bar , ...

Trường được xác thực không được bao gồm trong danh sách các giá trị đã cho. Các Rule::notInphương pháp có thể được sử dụng để thành thạo xây dựng các quy tắc:

use Illuminate\Validation\Rule;

Validator::make($data, [
    'toppings' => [
        'required',
        Rule::notIn(['sprinkles', 'cherries']),
    ],
]);

 

not_regex: mẫu

Trường được xác thực không được khớp với biểu thức chính quy đã cho.

Nội bộ, quy tắc này sử dụng preg_matchhàm PHP . Mẫu được chỉ định phải tuân theo cùng một định dạng được yêu cầu preg_matchvà do đó cũng bao gồm các dấu phân cách hợp lệ. Ví dụ: 'email' => 'not_regex:/^.+$/i'.

 

Khi sử dụng regexnot_regexcác mẫu, có thể cần phải chỉ định các quy tắc xác thực của bạn bằng cách sử dụng một mảng thay vì sử dụng |dấu phân cách, đặc biệt nếu biểu thức chính quy có chứa một |ký tự.

 

 

vô hiệu

Trường được xác thực có thể là null.

 

số

Trường được xác thực phải là trường số .

 

mật khẩu mở khóa

Trường được xác thực phải khớp với mật khẩu của người dùng đã xác thực.

 

Quy tắc này đã được đổi tên thành current_passwordvới ý định xóa nó trong Laravel 9. Thay vào đó, hãy sử dụng quy tắc Mật khẩu Hiện tại .

 

 

Món quà

Trường được xác thực phải có trong dữ liệu đầu vào nhưng có thể để trống.

 

Cấm

Trường được xác thực phải trống hoặc không có.

 

cấm_if : trường khác , giá trị , ...

Các lĩnh vực được thẩm định phải rỗng hoặc không có mặt nếu anotherfield lĩnh vực tương đương với bất kỳ giá trị .

 

Cấm_unless : anotherfield , value , ...

Các lĩnh vực được thẩm định phải rỗng hoặc không có mặt trừ khi anotherfield lĩnh vực tương đương với bất kỳ giá trị .

 

các điều cấm: anotherfield , ...

Nếu trường dưới xác nhận là hiện nay, không có trường trong anotherfield thể có mặt, ngay cả khi có sản phẩm nào.

 

regex: mẫu

Trường được xác thực phải khớp với biểu thức chính quy đã cho.

Nội bộ, quy tắc này sử dụng preg_matchhàm PHP . Mẫu được chỉ định phải tuân theo cùng một định dạng được yêu cầu preg_matchvà do đó cũng bao gồm các dấu phân cách hợp lệ. Ví dụ: 'email' => 'regex:/^.+@.+$/i'.

 

Khi sử dụng regexnot_regexcác mẫu, có thể cần chỉ định các quy tắc trong một mảng thay vì sử dụng các |dấu phân cách, đặc biệt nếu biểu thức chính quy có chứa một |ký tự.

 

 

yêu cầu

Trường được xác thực phải có trong dữ liệu đầu vào và không được để trống. Một trường được coi là "trống" nếu một trong các điều kiện sau là đúng:

  • Giá trị là null.
  • Giá trị là một chuỗi rỗng.
  • Giá trị là một mảng trống hoặc Countableđối tượng trống .
  • Giá trị là một tệp được tải lên không có đường dẫn.

 

Requi_if : trường khác , giá trị , ...

Các lĩnh vực được thẩm định phải có mặt và không có sản phẩm nào nếu anotherfield lĩnh vực tương đương với bất kỳ giá trị .

Nếu bạn muốn xây dựng một điều kiện phức tạp hơn cho required_ifquy tắc, bạn có thể sử dụng Rule::requiredIfphương pháp này. Phương thức này chấp nhận một boolean hoặc một bao đóng. Khi đã thông qua một lần đóng, thì lần đóng đó sẽ trả về truehoặc falseđể cho biết trường đang được xác thực có được yêu cầu hay không:

use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;

Validator::make($request->all(), [
    'role_id' => Rule::requiredIf($request->user()->is_admin),
]);

Validator::make($request->all(), [
    'role_id' => Rule::requiredIf(function () use ($request) {
        return $request->user()->is_admin;
    }),
]);

 

Requi_unless : trường khác , giá trị , ...

Các lĩnh vực được thẩm định phải có mặt và không có sản phẩm nào trừ khi anotherfield lĩnh vực tương đương với bất kỳ giá trị . Điều này cũng có nghĩa là anotherfield phải có mặt trong các dữ liệu yêu cầu trừ khi giá trị là null. Nếu giá trị là nullrequired_unless:name,null), trường được xác thực sẽ được yêu cầu trừ khi trường so sánh là nullhoặc trường so sánh bị thiếu trong dữ liệu yêu cầu.

 

Requi_with : foo , bar , ...

Trường được xác thực phải có mặt và không được để trống chỉ khi bất kỳ trường nào được chỉ định khác có mặt và không trống.

 

Requi_with_all : foo , bar , ...

Trường được xác thực phải có mặt và không trống chỉ khi tất cả các trường được chỉ định khác đều có mặt và không trống.

 

Requi_without : foo , bar , ...

Trường được xác thực phải có mặt và không được để trống chỉ khi bất kỳ trường nào được chỉ định khác trống hoặc không có.

 

Requi_without_all : foo , bar , ...

Trường được xác thực phải có mặt và không được để trống chỉ khi tất cả các trường được chỉ định khác trống hoặc không có.

 

giống nhau: lĩnh vực

Các trao lĩnh vực phải phù hợp với lĩnh vực này dưới xác nhận.

 

kích thước: giá trị

Trường được xác thực phải có kích thước phù hợp với giá trị đã cho . Đối với dữ liệu chuỗi, giá trị tương ứng với số ký tự. Đối với dữ liệu số, giá trị tương ứng với một giá trị nguyên nhất định (thuộc tính cũng phải có quy tắc numerichoặc integer). Đối với một mảng, kích thước tương ứng với giá counttrị của mảng. Đối với tệp, kích thước tương ứng với kích thước tệp tính bằng kilobyte. Hãy xem một số ví dụ:

// Validate that a string is exactly 12 characters long...
'title' => 'size:12';

// Validate that a provided integer equals 10...
'seats' => 'integer|size:10';

// Validate that an array has exactly 5 elements...
'tags' => 'array|size:5';

// Validate that an uploaded file is exactly 512 kilobytes...
'image' => 'file|size:512';

 

start_with: foo , bar , ...

Trường được xác thực phải bắt đầu bằng một trong các giá trị đã cho.

 

dây

Trường được xác thực phải là một chuỗi. Nếu bạn cũng muốn cho phép trường null, bạn nên chỉ định nullablequy tắc cho trường.

 

Múi giờ

Trường được xác thực phải là mã định danh múi giờ hợp lệ theo timezone_identifiers_listhàm PHP.

 

duy nhất: bảng , cột , ngoại trừ , idColumn

Trường được xác thực không được tồn tại trong bảng cơ sở dữ liệu đã cho.

Chỉ định một bảng / tên cột tùy chỉnh:

Thay vì chỉ định trực tiếp tên bảng, bạn có thể chỉ định mô hình Eloquent sẽ được sử dụng để xác định tên bảng:

'email' => 'unique:App\Models\User,email_address'

Các columntùy chọn có thể được sử dụng để xác định cột cơ sở dữ liệu tương ứng của trường. Nếu columntùy chọn không được chỉ định, tên của trường được xác thực sẽ được sử dụng.

'email' => 'unique:users,email_address'

Chỉ định một kết nối cơ sở dữ liệu tùy chỉnh

Đôi khi, bạn có thể cần đặt kết nối tùy chỉnh cho các truy vấn cơ sở dữ liệu do Trình xác thực thực hiện. Để thực hiện điều này, bạn có thể thêm tên kết nối vào tên bảng:

'email' => 'unique:connection.users,email_address'

Buộc một quy tắc duy nhất để bỏ qua một ID đã cho:

Đôi khi, bạn có thể muốn bỏ qua một ID nhất định trong quá trình xác thực duy nhất. Ví dụ: hãy xem xét màn hình "hồ sơ cập nhật" bao gồm tên, địa chỉ email và vị trí của người dùng. Bạn có thể sẽ muốn xác minh rằng địa chỉ email là duy nhất. Tuy nhiên, nếu người dùng chỉ thay đổi trường tên chứ không phải trường email, bạn không muốn xảy ra lỗi xác thực vì người dùng đã là chủ sở hữu của địa chỉ email được đề cập.

Để hướng dẫn trình xác thực bỏ qua ID của người dùng, chúng tôi sẽ sử dụng Rulelớp để xác định quy tắc một cách thành thạo. Trong ví dụ này, chúng tôi cũng sẽ chỉ định các quy tắc xác thực dưới dạng một mảng thay vì sử dụng |ký tự để phân tách các quy tắc:

use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;

Validator::make($data, [
    'email' => [
        'required',
        Rule::unique('users')->ignore($user->id),
    ],
]);

 

Bạn không bao giờ được chuyển bất kỳ đầu vào yêu cầu do người dùng kiểm soát nào vào ignorephương thức. Thay vào đó, bạn chỉ nên chuyển một ID duy nhất do hệ thống tạo ra, chẳng hạn như ID hoặc UUID tăng tự động từ một phiên bản mô hình Eloquent. Nếu không, ứng dụng của bạn sẽ dễ bị tấn công SQL injection.

 

Thay vì chuyển giá trị của khóa mô hình cho ignorephương thức, bạn cũng có thể chuyển toàn bộ phiên bản mô hình. Laravel sẽ tự động trích xuất khóa từ mô hình:

Rule::unique('users')->ignore($user)

Nếu bảng của bạn sử dụng tên cột khóa chính khác với id, bạn có thể chỉ định tên của cột khi gọi ignorephương thức:

Rule::unique('users')->ignore($user->id, 'user_id')

Theo mặc định, uniquequy tắc sẽ kiểm tra tính duy nhất của cột khớp với tên của thuộc tính đang được xác thực. Tuy nhiên, bạn có thể chuyển một tên cột khác làm đối số thứ hai cho uniquephương thức:

Rule::unique('users', 'email_address')->ignore($user->id),

Thêm điều khoản bổ sung ở đâu:

Bạn có thể chỉ định các điều kiện truy vấn bổ sung bằng cách tùy chỉnh truy vấn bằng wherephương pháp này. Ví dụ: hãy thêm điều kiện truy vấn phạm vi truy vấn để chỉ tìm kiếm các bản ghi có account_idgiá trị cột là 1:

'email' => Rule::unique('users')->where(function ($query) {
    return $query->where('account_id', 1);
})

 

url

Trường được xác thực phải là một URL hợp lệ.

 

uuid

Trường được xác thực phải là mã định danh duy nhất RFC 4122 (phiên bản 1, 3, 4 hoặc 5) hợp lệ (UUID).

 

Thêm quy tắc có điều kiện

 

Bỏ qua xác thực khi trường có giá trị nhất định

Đôi khi bạn có thể muốn không xác thực một trường nhất định nếu một trường khác có giá trị nhất định. Bạn có thể thực hiện điều này bằng cách sử dụng exclude_ifquy tắc xác thực. Trong ví dụ này, các trường appointment_datevà doctor_namesẽ không được xác thực nếu has_appointmenttrường có giá trị là false:

use Illuminate\Support\Facades\Validator;

$validator = Validator::make($data, [
    'has_appointment' => 'required|boolean',
    'appointment_date' => 'exclude_if:has_appointment,false|required|date',
    'doctor_name' => 'exclude_if:has_appointment,false|required|string',
]);

Ngoài ra, bạn có thể sử dụng exclude_unlessquy tắc để không xác thực một trường nhất định trừ khi một trường khác có giá trị nhất định:

$validator = Validator::make($data, [
    'has_appointment' => 'required|boolean',
    'appointment_date' => 'exclude_unless:has_appointment,true|required|date',
    'doctor_name' => 'exclude_unless:has_appointment,true|required|string',
]);

 

Xác thực khi có mặt

Trong một số trường hợp, bạn có thể muốn chạy kiểm tra xác nhận đối với một lĩnh vực duy nhất nếu trường đó có mặt trong các dữ liệu được xác nhận. Để nhanh chóng thực hiện điều này, hãy thêm sometimesquy tắc vào danh sách quy tắc của bạn:

$v = Validator::make($data, [
    'email' => 'sometimes|required|email',
]);

Trong ví dụ trên, emailtrường sẽ chỉ được xác thực nếu nó có trong $datamảng.

 

Nếu bạn đang cố gắng xác thực một trường luôn có nhưng có thể trống, hãy xem ghi chú này trên các trường tùy chọn .

 

 

Xác thực có điều kiện phức tạp

Đôi khi bạn có thể muốn thêm các quy tắc xác thực dựa trên logic điều kiện phức tạp hơn. Ví dụ: bạn có thể chỉ muốn yêu cầu một trường nhất định nếu một trường khác có giá trị lớn hơn 100. Hoặc, bạn có thể cần hai trường để có một giá trị nhất định chỉ khi có trường khác. Việc thêm các quy tắc xác thực này không phải là một vấn đề khó khăn. Đầu tiên, hãy tạo một Validatorphiên bản với các quy tắc tĩnh không bao giờ thay đổi của bạn:

use Illuminate\Support\Facades\Validator;

$validator = Validator::make($request->all(), [
    'email' => 'required|email',
    'games' => 'required|numeric',
]);

Hãy giả sử ứng dụng web của chúng tôi là dành cho những người sưu tập trò chơi. Nếu một người sưu tập trò chơi đăng ký với ứng dụng của chúng tôi và họ sở hữu hơn 100 trò chơi, chúng tôi muốn họ giải thích lý do tại sao họ sở hữu nhiều trò chơi như vậy. Ví dụ: có lẽ họ điều hành một cửa hàng bán lại trò chơi hoặc có thể họ chỉ thích sưu tập trò chơi. Để thêm yêu cầu này một cách có điều kiện, chúng ta có thể sử dụng sometimesphương thức trên Validatorphiên bản.

$validator->sometimes('reason', 'required|max:500', function ($input) {
    return $input->games >= 100;
});

Đối số đầu tiên được truyền cho sometimesphương thức là tên của trường mà chúng tôi đang xác thực có điều kiện. Đối số thứ hai là danh sách các quy tắc mà chúng ta muốn thêm vào. Nếu đóng cửa được truyền khi đối số thứ ba trả về true, các quy tắc sẽ được thêm vào. Phương pháp này giúp bạn dễ dàng xây dựng các xác nhận có điều kiện phức tạp. Bạn thậm chí có thể thêm xác thực có điều kiện cho nhiều trường cùng một lúc:

$validator->sometimes(['reason', 'cost'], 'required', function ($input) {
    return $input->games >= 100;
});

 

Các $inputtham số truyền cho việc đóng cửa của bạn sẽ được một thể hiện của Illuminate\Support\Fluentvà có thể được sử dụng để truy cập vào và các tập tin của bạn dưới xác nhận.

 

 

Xác thực mảng có điều kiện phức tạp

Đôi khi bạn có thể muốn xác thực một trường dựa trên một trường khác trong cùng một mảng lồng nhau có chỉ mục mà bạn không biết. Trong những trường hợp này, bạn có thể cho phép việc đóng của mình nhận đối số thứ hai, đối số này sẽ là mục riêng lẻ hiện tại trong mảng đang được xác thực:

$input = [
    'channels' => [
        [
            'type' => 'email',
            'address' => 'abigail@example.com',
        ],
        [
            'type' => 'url',
            'address' => 'https://example.com',
        ],
    ],
];

$validator->sometimes('channels.*.address', 'email', function($input, $item) {
    return $item->type === 'email';
});

$validator->sometimes('channels.*.address', 'url', function($input, $item) {
    return $item->type !== 'email';
});

Giống như $inputtham số được truyền cho bao đóng, $itemtham số là một thể hiện Illuminate\Support\Fluentkhi dữ liệu thuộc tính là một mảng; nếu không, nó là một chuỗi.

 

Xác thực Mảng

Như đã thảo luận trong arraytài liệu quy tắc xác thực , arrayquy tắc chấp nhận danh sách các khóa mảng được phép. Nếu có bất kỳ khóa bổ sung nào trong mảng, việc xác thực sẽ không thành công:

use Illuminate\Support\Facades\Validator;

$input = [
    'user' => [
        'name' => 'Taylor Otwell',
        'username' => 'taylorotwell',
        'admin' => true,
    ],
];

Validator::make($input, [
    'user' => 'array:username,locale',
]);

Nói chung, bạn phải luôn chỉ định các khóa mảng được phép hiện diện trong mảng của bạn. Nếu không, trình xác thực validatevà validatedcác phương thức sẽ trả về tất cả dữ liệu đã được xác thực, bao gồm mảng và tất cả các khóa của nó, ngay cả khi các khóa đó không được xác thực bởi các quy tắc xác thực mảng lồng nhau khác.

 

Loại trừ các khóa mảng chưa xác thực

Nếu muốn, bạn có thể hướng dẫn trình xác thực của Laravel không bao giờ bao gồm các khóa mảng chưa được xác thực trong dữ liệu "đã được xác thực" mà nó trả về, ngay cả khi bạn sử dụng arrayquy tắc mà không chỉ định danh sách các khóa được phép. Để thực hiện điều này, bạn có thể gọi excludeUnvalidatedArrayKeysphương thức của trình xác thực trong bootphương thức của ứng dụng của bạn AppServiceProvider. Sau khi làm như vậy, trình xác thực sẽ bao gồm các khóa mảng trong dữ liệu "đã được xác thực", nó chỉ trả về khi các khóa đó đã được xác thực cụ thể bởi các quy tắc mảng lồng nhau :

use Illuminate\Support\Facades\Validator;

/**
 * Register any application services.
 *
 * @return void
 */
public function boot()
{
    Validator::excludeUnvalidatedArrayKeys();
}

 

Xác thực đầu vào mảng lồng nhau

Việc xác thực các trường đầu vào biểu mẫu dựa trên mảng lồng nhau không phải là điều khó khăn. Bạn có thể sử dụng "ký hiệu dấu chấm" để xác thực các thuộc tính trong một mảng. Ví dụ: nếu yêu cầu HTTP đến có chứa một photos[profile]trường, bạn có thể xác thực nó như sau:

use Illuminate\Support\Facades\Validator;

$validator = Validator::make($request->all(), [
    'photos.profile' => 'required|image',
]);

Bạn cũng có thể xác thực từng phần tử của một mảng. Ví dụ: để xác thực rằng mỗi email trong một trường nhập mảng nhất định là duy nhất, bạn có thể thực hiện như sau:

$validator = Validator::make($request->all(), [
    'person.*.email' => 'email|unique:users',
    'person.*.first_name' => 'required_with:person.*.last_name',
]);

Tương tự như vậy, bạn có thể sử dụng *ký tự khi chỉ định thông báo xác thực tùy chỉnh trong tệp ngôn ngữ của mình , giúp bạn dễ dàng sử dụng một thông báo xác thực duy nhất cho các trường dựa trên mảng:

'custom' => [
    'person.*.email' => [
        'unique' => 'Each person must have a unique email address',
    ]
],

 

Xác thực mật khẩu

Để đảm bảo rằng mật khẩu có mức độ phức tạp phù hợp, bạn có thể sử dụng Passwordđối tượng quy tắc của Laravel :

use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rules\Password;

$validator = Validator::make($request->all(), [
    'password' => ['required', 'confirmed', Password::min(8)],
]);

Các Passwordđối tượng quy tắc cho phép bạn dễ dàng tùy chỉnh các yêu cầu mật khẩu phức tạp cho các ứng dụng của bạn, chẳng hạn như xác định rằng mật khẩu cần ít nhất một lá thư, số, ký hiệu, hoặc các ký tự với vỏ hỗn hợp:

// Require at least 8 characters...
Password::min(8)

// Require at least one letter...
Password::min(8)->letters()

// Require at least one uppercase and one lowercase letter...
Password::min(8)->mixedCase()

// Require at least one number...
Password::min(8)->numbers()

// Require at least one symbol...
Password::min(8)->symbols()

Ngoài ra, bạn có thể đảm bảo rằng mật khẩu không bị xâm phạm trong vụ rò rỉ dữ liệu mật khẩu công khai bằng cách sử dụng uncompromisedphương pháp:

Password::min(8)->uncompromised()

Trong nội bộ, Passwordđối tượng quy tắc sử dụng mô hình k-Anonymous để xác định xem mật khẩu có bị rò rỉ qua dịch vụ hasibeenpwned.com mà không ảnh hưởng đến quyền riêng tư hoặc bảo mật của người dùng hay không.

Theo mặc định, nếu mật khẩu xuất hiện ít nhất một lần trong một lần rò rỉ dữ liệu, mật khẩu đó sẽ bị coi là bị xâm phạm. Bạn có thể tùy chỉnh ngưỡng này bằng cách sử dụng đối số đầu tiên của uncompromisedphương pháp:

// Ensure the password appears less than 3 times in the same data leak...
Password::min(8)->uncompromised(3);

Tất nhiên, bạn có thể xâu chuỗi tất cả các phương thức trong các ví dụ trên:

Password::min(8)
    ->letters()
    ->mixedCase()
    ->numbers()
    ->symbols()
    ->uncompromised()

 

Xác định quy tắc mật khẩu mặc định

Bạn có thể thấy thuận tiện khi chỉ định các quy tắc xác thực mặc định cho mật khẩu ở một vị trí duy nhất trong ứng dụng của bạn. Bạn có thể dễ dàng thực hiện điều này bằng cách sử dụng Password::defaultsphương thức chấp nhận một đóng. Đóng cho defaultsphương thức sẽ trả về cấu hình mặc định của quy tắc Mật khẩu. Thông thường, defaultsquy tắc sẽ được gọi trong bootphương thức của một trong các nhà cung cấp dịch vụ ứng dụng của bạn:

use Illuminate\Validation\Rules\Password;

/**
 * Bootstrap any application services.
 *
 * @return void
 */
public function boot()
{
    Password::defaults(function () {
        $rule = Password::min(8);

        return $this->app->isProduction()
                    ? $rule->mixedCase()->uncompromised()
                    : $rule;
    });
}

Sau đó, khi bạn muốn áp dụng các quy tắc mặc định cho một mật khẩu cụ thể đang được xác thực, bạn có thể gọi defaultsphương thức không có đối số:

'password' => ['required', Password::defaults()],

 

Quy tắc xác thực tùy chỉnh

 

Sử dụng đối tượng quy tắc

Laravel cung cấp nhiều quy tắc xác thực hữu ích; tuy nhiên, bạn có thể muốn chỉ định một số của riêng bạn. Một phương pháp đăng ký quy tắc xác thực tùy chỉnh là sử dụng các đối tượng quy tắc. Để tạo một đối tượng quy tắc mới, bạn có thể sử dụng make:rulelệnh Artisan. Hãy sử dụng lệnh này để tạo quy tắc xác minh một chuỗi là chữ hoa. Laravel sẽ đặt quy tắc mới trong app/Rulesthư mục. Nếu thư mục này không tồn tại, Laravel sẽ tạo nó khi bạn thực hiện lệnh Artisan để tạo quy tắc của bạn:

php artisan make:rule Uppercase

Khi quy tắc đã được tạo, chúng tôi đã sẵn sàng xác định hành vi của nó. Một đối tượng quy tắc chứa hai phương thức: passesvà message. Các passesphương pháp nhận giá trị thuộc tính và tên, và phải trả lại truehoặc falsetuỳ thuộc vào việc các giá trị thuộc tính là hợp lệ hay không. Các messagephương pháp nên trả lại thông báo lỗi xác nhận rằng nên được sử dụng khi xác nhận thất bại:

<?php

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;

class Uppercase implements Rule
{
    /**
     * Determine if the validation rule passes.
     *
     * @param  string  $attribute
     * @param  mixed  $value
     * @return bool
     */
    public function passes($attribute, $value)
    {
        return strtoupper($value) === $value;
    }

    /**
     * Get the validation error message.
     *
     * @return string
     */
    public function message()
    {
        return 'The :attribute must be uppercase.';
    }
}

Bạn có thể gọi trình transtrợ giúp từ messagephương pháp của mình nếu bạn muốn trả lại thông báo lỗi từ các tệp bản dịch của mình:

/**
 * Get the validation error message.
 *
 * @return string
 */
public function message()
{
    return trans('validation.uppercase');
}

Khi quy tắc đã được xác định, bạn có thể đính kèm quy tắc đó vào trình xác thực bằng cách chuyển một phiên bản của đối tượng quy tắc với các quy tắc xác thực khác của bạn:

use App\Rules\Uppercase;

$request->validate([
    'name' => ['required', 'string', new Uppercase],
]);

 

Sử dụng Closures

Nếu bạn chỉ cần chức năng của quy tắc tùy chỉnh một lần trong toàn bộ ứng dụng của mình, bạn có thể sử dụng bao đóng thay vì đối tượng quy tắc. Bao đóng nhận được tên của thuộc tính, giá trị của thuộc tính và một lệnh $failgọi lại sẽ được gọi nếu quá trình xác thực không thành công:

use Illuminate\Support\Facades\Validator;

$validator = Validator::make($request->all(), [
    'title' => [
        'required',
        'max:255',
        function ($attribute, $value, $fail) {
            if ($value === 'foo') {
                $fail('The '.$attribute.' is invalid.');
            }
        },
    ],
]);

 

Quy tắc ngầm định

Theo mặc định, khi một thuộc tính đang được xác thực không có mặt hoặc chứa một chuỗi trống, các quy tắc xác thực thông thường, bao gồm cả các quy tắc tùy chỉnh, sẽ không được chạy. Ví dụ: uniquequy tắc sẽ không được chạy với một chuỗi trống:

use Illuminate\Support\Facades\Validator;

$rules = ['name' => 'unique:users,name'];

$input = ['name' => ''];

Validator::make($input, $rules)->passes(); // true

Để quy tắc tùy chỉnh chạy ngay cả khi thuộc tính trống, quy tắc phải ngụ ý rằng thuộc tính đó là bắt buộc. Để tạo quy tắc "ngầm", hãy triển khai Illuminate\Contracts\Validation\ImplicitRulegiao diện. Giao diện này phục vụ như một "giao diện đánh dấu" cho trình xác nhận; do đó, nó không chứa bất kỳ phương pháp bổ sung nào bạn cần triển khai ngoài các phương pháp được yêu cầu bởi Rulegiao diện điển hình .

Để tạo một đối tượng quy tắc ngầm mới, bạn có thể sử dụng make:rulelệnh Artisan với --implicittùy chọn:

 php artisan make:rule Uppercase --implicit

 

Quy tắc "ngầm" chỉ ngụ ý rằng thuộc tính là bắt buộc. Việc nó có thực sự làm mất hiệu lực của một thuộc tính bị thiếu hoặc trống hay không là tùy thuộc vào bạn.

 

» Tiếp: Mail
« Trước: Các mẫu Blade
Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực
Copied !!!