Laravel: Xác thực (Validation)
Giải phóng thời gian, khai phóng năng lực
- Giới thiệu
- Bắt đầu nhanh xác thực
- Xác thực yêu cầu biểu mẫu
- Tạo trình xác thực theo cách thủ công
- Làm việc với đầu vào đã được xác thực
- Làm việc với thông báo lỗi
- Quy tắc xác thực có sẵn
- Thêm quy tắc có điều kiện
- Xác thực Mảng
- Xác thực mật khẩu
- Quy tắc xác thực tùy chỉnh
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 validate
phươ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.php
tệ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 GET
tuyế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 POST
tuyế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. store
Bâ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 store
phươ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 validate
phươ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ề validate
phương pháp này, hãy quay lại store
phươ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 validate
phươ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 validateWithBag
phươ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 bail
quy 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 unique
quy tắc trên title
thuộc tính không thành công, max
quy 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 $errors
biế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\ShareErrorsFromSession
phần mềm trung gian, được cung cấp bởi web
nhóm phần mềm trung gian. Khi phần mềm trung gian này được áp dụng, một $errors
biế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 $errors
biến luôn được xác định và có thể được sử dụng một cách an toàn. Các $errors
biế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 create
phươ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.php
tệ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 validate
phươ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 @error
Chỉ 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 @error
chỉ thị, bạn có thể lặp lại $message
biế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 @error
chỉ 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 old
phương thức trên một phiên bản của Illuminate\Http\Request
. Các old
phươ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 old
trợ 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 old
trợ 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, null
sẽ đượ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 TrimStrings
và ConvertEmptyStringsToNull
phầ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\Kernel
lớ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ư nullable
thể bạn không muốn trình xác thực coi null
cá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_at
trường có thể là một trong hai null
hoặc một đại diện ngày hợp lệ. Nếu công cụ nullable
sửa đổi không được thêm vào định nghĩa quy tắc, trình xác thực sẽ coi null
là 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:request
Artisan CLI:
php artisan make:request StorePostRequest
Lớp yêu cầu biểu mẫu đã tạo sẽ được đặt trong app/Http/Requests
thư 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:request
lệnh. Mỗi yêu cầu biểu mẫu do Laravel tạo ra có hai phương thức: authorize
và rules
.
Như bạn có thể đoán, authorize
phươ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 rules
phươ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
rules
chữ 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 withValidator
phươ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 stopOnFirstFailure
tí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 authorize
phươ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 user
phươ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 route
phươ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 authorize
phươ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 true
từ authorize
phươ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
authorize
chữ 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 đè messages
phươ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 :attribute
trình giữ chỗ. Nếu bạn muốn :attribute
trì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 đè attributes
phươ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 prepareForValidation
phươ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 validate
phươ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 make
phươ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 make
phươ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 withErrors
phươ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, $errors
biế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 withErrors
phươ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 stopOnFirstFailure
phươ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 validate
phương thức của yêu cầu HTTP , bạn có thể gọi validate
phươ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 validateWithBag
phươ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 MessageBag
chứ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 MessageBag
từ $errors
biế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::make
phương thức:
$validator = Validator::make($input, $rules, $messages = [
'required' => 'The :attribute field is required.',
]);
Trong ví dụ này, :attribute
trì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 :attribute
trì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::make
phươ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 after
phươ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 validated
phươ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 safe
phươ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 only
, except
và all
cá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\ValidatedInput
phiê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 collect
phương thức:
$collection = $request->safe()->collect();
Làm việc với thông báo lỗi
Sau khi gọi errors
phương thức trên một Validator
phiên bản, bạn sẽ nhận được một Illuminate\Support\MessageBag
phiê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 $errors
biế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 MessageBag
lớ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 first
phươ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 get
phươ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 all
phươ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 has
phươ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.php
tệ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 custom
mảng resources/lang/xx/validation.php
tệ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 :attribute
trì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 :attribute
phầ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 attributes
mảng của resources/lang/xx/validation.php
tệ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 :value
trì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 :value
phầ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_type
nà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ị cc
dướ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.php
tệp ngôn ngữ của mình bằng cách xác định một values
mả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 chấp nhận nếuURL hoạt độngSau (Ngày)Sau hoặc bằng (Ngày)AlphaDấu gạch ngang AlphaAlpha NumericMảngTại ngoạiTrước (Ngày)Trước hoặc bằng (Ngày)GiữaBooleanĐã xác nhậnMật khẩu hiện tạiNgàyNgày bằngĐịnh dạng ngày thángKhác nhauChữ sốChữ số giữaKích thước (Tệp hình ảnh)Riêng biệtE-mailKết thúc vớiLoại trừLoại trừ nếuLoại trừ Trừ khiTồn tại (Cơ sở dữ liệu)Tập tinĐiềnLớn hơnLớn hơn hoặc bằngHình ảnh (Tệp)TrongTrong mảngSố nguyênĐịa chỉ IPJSONÍt hơnNhỏ hơn hoặc bằngMaxCác loại MIMELoại MIME theo phần mở rộng tệpMinNhiềuKhông có trongKhông phải RegexNullableSốMật khẩuMón quàCấmBị cấm nếuBị cấm trừ khiNhững điều cấmBiểu hiện thông thườngYêu cầuBắt buộc NếuBắt buộc trừ khiYêu cầu VớiBắt buộc với tất cảBắt buộc Không cóBắt buộc Không có Tất cảTương tựKích thướcThỉnh thoảngBắt đầu vớiDâyMúi giờDuy nhất (Cơ sở dữ liệu)URLUUID
Đã đượ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 true
nế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_record
hàm PHP. Tên máy chủ của URL đã cung cấp được trích xuất bằng parse_url
hà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 strtotime
hà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 array
quy 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, admin
khó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 array
quy 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 validate
và validated
cá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 array
quy 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 excludeUnvalidatedArrayKeys
phương thức của trình xác thực trong boot
phươ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ù bail
quy 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 stopOnFirstFailure
phươ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 strtotime
hàm PHP để được chuyển đổi thành một phiên bản hợp lệ DateTime
. Ngoài ra, giống như after
quy 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 strtotime
hàm PHP để được chuyển đổi thành một phiên bản hợp lệ DateTime
. Ngoài ra, giống như after
quy 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ư size
quy 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à true
, false
, 1
, 0
, "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_confirmation
trườ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 strtotime
hà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 strtotime
hà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_format
khi 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/2
hoặ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::dimensions
phươ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 strict
tham 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_case
và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'
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-validator
gói để xác thực địa chỉ email. Theo mặc định, RFCValidation
trì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 RFCValidation
và 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:
rfc
:RFCValidation
strict
:NoRFCWarningsValidation
dns
:DNSCheckValidation
spoof
:SpoofCheckValidation
filter
:FilterEmailValidation
Các filter
validator, trong đó sử dụng PHP filter_var
chứ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
dns
vàspoof
xác nhận yêu cầu PHPintl
mở 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 validate
và 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 validate
và validated
phươ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 validate
và validated
phương pháp trừ khi anotherfield trường 's tương đương với giá trị . Nếu giá trị là null
( exclude_unless:name,null
), trường được xác thực sẽ bị loại trừ trừ khi trường so sánh là null
hoặ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 column
tù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 states
bảng cơ sở dữ liệu chứa bản ghi có state
giá trị cột khớp với state
giá 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 exists
truy 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 Rule
lớ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ư size
quy 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ư size
quy 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 implode
một mảng, nên Rule::in
phươ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 in
quy tắc được kết hợp với array
quy 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 in
quy tắc. Trong ví dụ sau, LAS
mã 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 in
quy 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_INT
quy 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ácnumeric
quy 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ư size
quy 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ư size
quy 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ư size
quy 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ư size
quy 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::notIn
phươ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_match
hà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_match
và 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
regex
/not_regex
cá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_password
vớ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_match
hà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_match
và 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
regex
/not_regex
cá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_if
quy tắc, bạn có thể sử dụng Rule::requiredIf
phươ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ề true
hoặ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à null
( required_unless:name,null
), trường được xác thực sẽ được yêu cầu trừ khi trường so sánh là null
hoặ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 numeric
hoặc integer
). Đối với một mảng, kích thước tương ứng với giá count
trị 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 nullable
quy 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_list
hà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 column
tù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 column
tù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 Rule
lớ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
ignore
phươ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 ignore
phươ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 ignore
phương thức:
Rule::unique('users')->ignore($user->id, 'user_id')
Theo mặc định, unique
quy 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 unique
phươ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 where
phươ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_id
giá 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_if
quy tắc xác thực. Trong ví dụ này, các trường appointment_date
và doctor_name
sẽ không được xác thực nếu has_appointment
trườ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_unless
quy 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 sometimes
quy 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, email
trường sẽ chỉ được xác thực nếu nó có trong $data
mả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 Validator
phiê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 sometimes
phương thức trên Validator
phiên bản.
$validator->sometimes('reason', 'required|max:500', function ($input) {
return $input->games >= 100;
});
Đối số đầu tiên được truyền cho sometimes
phươ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
$input
tham số truyền cho việc đóng cửa của bạn sẽ được một thể hiện củaIlluminate\Support\Fluent
và 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ư $input
tham số được truyền cho bao đóng, $item
tham số là một thể hiện Illuminate\Support\Fluent
khi 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 array
tài liệu quy tắc xác thực , array
quy 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 validate
và validated
cá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 array
quy 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 excludeUnvalidatedArrayKeys
phương thức của trình xác thực trong boot
phươ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 uncompromised
phươ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 uncompromised
phươ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::defaults
phương thức chấp nhận một đóng. Đóng cho defaults
phươ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, defaults
quy tắc sẽ được gọi trong boot
phươ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 defaults
phươ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:rule
lệ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/Rules
thư 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: passes
và message
. Các passes
phương pháp nhận giá trị thuộc tính và tên, và phải trả lại true
hoặc false
tuỳ thuộc vào việc các giá trị thuộc tính là hợp lệ hay không. Các message
phươ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 trans
trợ giúp từ message
phươ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 $fail
gọ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ụ: unique
quy 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\ImplicitRule
giao 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 Rule
giao 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:rule
lệnh Artisan với --implicit
tù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.
Giải phóng thời gian, khai phóng năng lực