驗證表單請求
創建表單請求驗證 面對更復雜的驗證情境中,你可以創建一個「表單請求」來處理更為復雜的邏輯。表單請求是包含驗證邏輯的自定義請求類。可使用 命令 make: 來創建表單請求類:
php artisan make:request StoreBlogPost
復制
新生成的類保存在 app/Http/ 目錄下。如果這個目錄不存在,運行 make: 命令時它會被創建出來。讓我們添加一些驗證規則到 rules 方法中:
/**
* 獲取適用于請求的驗證規則。
*
* @return array
*/
public function rules()
{
return [
'title' => 'required|unique:posts|max:255',
'body' => 'required',
];
}
復制
Tip:你可以向 rules 方法傳入所需的任何依賴項。他們會自動被 提供的 [服務容器] 自動解析。
所以,驗證規則是如何運行的呢?你所需要做的就是在控制器方法中類型提示傳入的請求。在調用控制器方法之前驗證傳入的表單請求,這意味著你不需要在控制器中寫任何驗證邏輯:
/**
* 存儲傳入的博客文章。
*
* @param StoreBlogPost $request
* @return Response
*/
public function store(StoreBlogPost $request)
{
// 傳入的請求通過驗證...
// 獲取通過驗證的數據...
$validated = $request->validated();
}
復制
如果驗證失敗,就會生成一個讓用戶返回到先前的位置的重定向響應。這些錯誤也會被閃存到 中,以便這些錯誤都可以在頁面中顯示出來。如果傳入的請求是 AJAX,會向用戶返回具有 422 狀態代碼和驗證錯誤信息的 JSON 數據的 HTTP 響應。
添加表單請求后鉤子
如果你想在表單請求「之后」添加鉤子,可以使用 方法。這個方法接收一個完整的驗證構造器,允許你在驗證結果返回之前調用任何方法:
/**
* 配置驗證器實例。
*
* @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!');
}
});
}
復制
表單請求授權驗證
表單請求類內也包含了 方法。在這個方法中,你可以檢查經過身份驗證的用戶確定其是否具有更新給定資源的權限。比方說,你可以判斷用戶是否擁有更新文章評論的權限:
/**
* 判斷用戶是否有權限做出此請求。
*
* @return bool
*/
public function authorize()
{
$comment = Comment::find($this->route('comment'));
return $comment && $this->user()->can('update', $comment);
}
復制
由于所有的表單請求都是繼承了 中的請求基類,所以我們可以使用 user 方法去獲取當前認證登錄的用戶。同時請注意上述例子中對 route 方法的調用。這個方法允許你在被調用的路由上獲取其定義的 URI 參數,譬如下面例子中的 {} 參數:
Route::post('comment/{comment}');
復制
如果 方法返回 false,則會自動返回一個包含 403 狀態碼的 HTTP 響應,也不會運行控制器的方法。
如果你打算在應用程序的其它部分處理授權邏輯,只需從 方法返回 true:
/**
* 判斷用戶是否有權限進行此請求。
*
* @return bool
*/
public function authorize()
{
return true;
}
復制
Tip:你可以向 方法傳入所需的任何依賴項。他們會自動被 提供的 [服務容器]自動解析。.
自定義錯誤消息
你可以通過重寫表單請求的 方法來自定義錯誤消息。此方法應返回屬性 / 規則對及其對應錯誤消息的數組:
/**
* 獲取已定義驗證規則的錯誤消息。
*
* @return array
*/
public function messages()
{
return [
'title.required' => 'A title is required',
'body.required' => 'A message is required',
];
}
復制
自定義驗證屬性
如果你希望將驗證消息的 : 部分替換為自定義屬性名稱,則可以重寫 方法來指定自定義名稱。此方法應返回屬性 / 名稱對的數組:
/**
* 獲取驗證錯誤的自定義屬性。
*
* @return array
*/
public function attributes()
{
return [
'email' => 'email address',
];
}
復制
手動創建驗證器
如果你不想在請求上使用 方法,你可以通過 []手動創建一個驗證器示例。用 []上的 make 方法創建一個驗證器示例:
class PostController extends Controller
{
/**
* 保存一篇新的博客文章。
*
* @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();
}
// 保存博客文章…
}
}
復制
傳給 make 方法的第一個參數是需要驗證的數據。第二個參數則是該數據的驗證規則。
如果驗證失敗,則可以使用 方法把錯誤消息閃存到 。使用這個方法進行重定向后, $ 變量會自動和視圖共享,你可以把這些消息顯示給用戶。 方法接收驗證器、 或 PHP Array 。
自動重定向
如果你想手動創建驗證器實例,又想使用 方法提供的自動重定向,那么你可以在現有的驗證器示例上調用 方法。如果驗證失敗,用戶將會自動重定向。在 AJAX 請求中,則會返回 JSON 格式的響應。
Validator::make($request->all(), [
'title' => 'required|unique:posts|max:255',
'body' => 'required',
])->validate();
復制
命名錯誤包
如果你一個頁面中有多個表單,你可以通過命名錯誤包來檢索特定表單的錯誤消息。只需給 方法傳遞一個名字作為第二個參數:
return redirect('register')
->withErrors($validator, 'login');
復制
然后你就可以從 $ 變量中獲取指定表單的錯誤消息:
{{ $errors->login->first('email') }}
復制
驗證后鉤子
驗證器還允許附加回調并在驗證完成后執行,以便你進行下一步的驗證,甚至在消息集合中添加更多的錯誤消息。使用它只需在驗證實例上使用 after 方法:
$validator = Validator::make(...);
$validator->after(function ($validator) {
if ($this->somethingElseIsInvalid()) {
$validator->errors()->add('field', 'Something is wrong with this field!');
}
});
if ($validator->fails()) {
//
}
復制
處理錯誤消息
通過 實例調用 方法,會返回 \\ 實例,它擁有各種方便的方法處理錯誤信息。自動提供給所有視圖的 $ 變量,也是 類的一個實例。
查看特定字段的第一個錯誤信息
要查看特定字段的第一個錯誤消息,可以使用 first 方法:
$errors = $validator->errors();
echo $errors->first('email');
復制
查看特定字段的所有錯誤消息
如果你需要獲取指定字段的所有錯誤信息的數組,則可以使用 get 方法:
foreach ($errors->get('email') as $message) {
//
}
復制
如果要驗證表單的數組字段,你可以使用 * 來獲取每個數組元素的所有錯誤消息:
foreach ($errors->get('attachments.*') as $message) {
//
}
復制
查看所有字段的所有錯誤消息
如果你想要得到所有字段的所有錯誤消息,可以使用 all 方法:
foreach ($errors->all() as $message) {
//
}
復制
判斷特定字段是否含有錯誤消息
has 方法可以被用來判斷指定字段是否存在錯誤信息:
if ($errors->has('email')) {
//
}
復制
自定義錯誤消息
如果有需要,你也可以使用自定義錯誤信息代替默認值進行驗證。有幾種方法可以指定自定義信息。首先,你可以將自定義信息作為第三個參數傳遞給 ::make 方法:
$messages = [
'required' => 'The :attribute field is required.',
];
$validator = Validator::make($input, $rules, $messages);
復制
在這個例子中, : 占位符會被驗證字段的實際名稱替換。除此之外,你還可以在驗證消息中使用其它占位符。例如:
$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',
];
復制
為給定屬性指定自定義信息
有時候你可能只想為特定的字段自定義錯誤信息。只需在屬性名稱后使用「點」來指定驗證的規則即可:
$messages = [
'email.required' => 'We need to know your e-mail address!',
];
復制
在 PHP 文件中指定自定義信息
在大多數情況下,您可能會在文件中指定自定義信息,而不是直接將它們傳遞給 。為此,需要把你的信息放置于 /lang/xx/.php 語言文件內的 數組中。
'custom' => [
'email' => [
'required' => 'We need to know your e-mail address!',
],
],
復制
在 PHP 文件中指定自定義屬性
如果你希望將驗證信息的 : 部分替換為自定義屬性名稱,你可以在 /lang/xx/.php 語言文件的 數組中指定自定義名稱:
'attributes' => [
'email' => 'email address',
],
復制
在 PHP 文件中指定自定義值
有時您可能需要將驗證信息的 :value 替換為自定義的表示形式。例如,指定 的值為 cc :
$request->validate([
'credit_card_number' => 'required_if:payment_type,cc'
]);
復制
如果此驗證規則失敗,將生成以下錯誤信息:
The credit card number field is required when payment type is cc.
復制
您可以通過在 語言文件中定義 數組指定自定義值表示形式,而不是將 cc 顯示為 的值:
'values' => [
'payment_type' => [
'cc' => 'credit card'
],
],
復制
如果驗證失敗,將生成以下信息:
The credit card number field is required when payment type is credit card.
復制
可用驗證規則
以下是所有可用驗證規則及其功能的列表:
URL After (Date) After Or Equal (Date) Alpha Alpha Dash Alpha Array Bail (Date) Or Equal (Date) Date Date Date (Image Files) E-Mail Ends With () File Than Than Or Equal Image (File) In In Array IP JSON Less Than Less Than Or Equal Max MIME Types MIME Type By File Min Not In Not Regex If With With All All Same Size With () URL UUID
驗證字段必須是 yes, on, 1,或 true。這在確認「服務條款」是否同意時相當有用。
根據 PHP 函數 ,驗證字段必須具有有效的 A 或 AAAA 記錄。
after:date
驗證字段必須是給定日期之后的值。日期值將傳遞到 PHP 函數 :
'start_date' => 'required|date|after:tomorrow'
復制
您可以指定另一個要與日期進行比較的字段,而不是傳遞要由 處理的日期字符串:
'finish_date' => 'required|date|after:start_date'
復制
:date
驗證字段必須是在給定日期之后或與此日期相同的值。更多信息,請參閱 [after]。
alpha
驗證字段必須完全由字母構成。
驗證字段可能包含字母、數字,以及破折號 (-) 和下劃線 ( _ )。
驗證字段必須是完全是字母、數字。
array
驗證的字段必須是一個 PHP 數組。
bail
在第一次驗證失敗后停止運行驗證規則。
:date
正在驗證的字段必須是給定日期之前的值。這個日期將傳遞到 PHP 的 函數中。此外,與 [after]規則一樣,另一個正在驗證的字段可以作為 date 的值。
:date
驗證字段必須是在給定日期之前或與之相同的日期。這個日期值將會被傳遞給 PHP 的 函數來計算。
:min,max
驗證字段的大小必須在給定的 min 和 max 之間。字符串、數字、數組和文件的計算方式都使用 size 方法。
驗證的字段必須可以轉換為 類型。 可接受的輸入為 true , false , 1 , 0 , "1" 和 "0" 。
驗證字段必須具有匹配字段 。例如,驗證字段為 ,輸入中必須存在與之匹配的 n 字段。
date
根據 PHP 函數,驗證的字段必須是有效的日期。
:date
驗證字段必須等于給定日期。日期將傳遞到 PHP 函數。
:
驗證字段必須匹配給定的日期格式。當驗證某個字段的時候,你應該 只使用 date 或者 ,而不是同時使用。此驗證規則支持 PHP 所有的 類。
:field
驗證的字段值必須與字段 field 的值不同。
:value
驗證的字段必須為 ,并且必須具有確切長度 value 。
:min,max
驗證字段的長度必須在給定的 min 和 max 之間。
驗證的文件必須是圖片并且圖片比例必須符合規則:
'avatar' => 'dimensions:min_width=100,min_height=200'
復制
可用的規則為:, , , , width, , ratio 。
ratio 約束應該表示為寬度除以高度。 這可以通過像 3/2 這樣的語句或像 1.5 這樣的 float 來指定:
'avatar' => 'dimensions:ratio=3/2'
復制
由于此規則需要多個參數,因此你可以 Rule:: 方法來構造可讀性高的規則:
use Illuminate\Validation\Rule;
Validator::make($data, [
'avatar' => [
'required',
Rule::dimensions()->maxWidth(1000)->maxHeight(500)->ratio(3 / 2),
],
]);
復制
驗證數組時,指定的字段不能有任何重復值。
'foo.*.id' => 'distinct'
復制
驗證的字段必須符合 e-mail 地址格式。當前版本,此種驗證規則由 /email- 提供支持。默認使用 驗證樣式,但你也可以使其他驗證樣式:
'email' => 'email:rfc,dns'
復制
例子使用 和 驗證樣式。所有可用驗證樣式列表:
當下版本 驗證規則使用 PHP 的 方法進行驗證,在 5.8 版本接入 。
:foo,bar,…
驗證的字段必須以給定的值之一結尾。
:table,
驗證的字段必須存在于給定的數據庫表中。
規則的基本用法
'state' => 'exists:states'
復制
如果未指定 選項,則將使用字段名稱。
指定列名
'state' => 'exists:states,abbreviation'
復制
如果你需要指定 方法用來查詢的數據庫。你可以通過使用「點」語法將數據庫的名稱添加到數據表前面來實現這個目的:
'email' => 'exists:connection.staff,email'
復制
如果要自定義驗證規則執行的查詢,可以使用 Rule 類來定義規則。在這個例子中,我們使用數組指定驗證規則,而不是使用 | 字符來分隔它們:
use Illuminate\Validation\Rule;
Validator::make($data, [
'email' => [

'required',
Rule::exists('staff')->where(function ($query) {
$query->where('account_id', 1);
}),
],
]);
復制
file
驗證的字段必須是成功上傳的文件。
驗證的字段在存在時不能為空。
gt:field
驗證字段必須大于給定的 field。兩個字段必須是相同的類型。字符串、數字、數組和文件都使用 size 進行相同的評估。
gte:field
驗證字段必須大于或等于給定的。兩個字段必須是相同的類型。字符串、數字、數組和文件都使用 size 進行相同的評估。
image
驗證的文件必須是圖片 (jpeg, png, bmp, gif, svg, or webp)
in:foo,bar,…
驗證字段必須包含在給定的值列表中。由于此規則通常要求您 數組,因此可以使用 Rule :: in 方法流暢地構造規則:
use Illuminate\Validation\Rule;
Validator::make($data, [
'zones' => [
'required',
Rule::in(['first-zone', 'second-zone']),
],
]);
復制
:.*
驗證的字段必須存在于另一個字段 的值中。
驗證的字段必須是整數。
{注} 此種驗證規則不是驗證數據是 “” 類型,僅驗證字符串或數值包含一個 .
ip
驗證的字段必須是 IP 地址。
ipv4
驗證的字段必須是 IPv4 地址。
ipv6
驗證的字段必須是 IPv6 地址。
json
驗證的字段必須是有效的 JSON 字符串。
lt:field
驗證的字段必須小于給定的 field.。這兩個字段必須是相同的類型。字符串、數值、數組和文件大小的計算方式與 size 方法進行評估。
lte:field
驗證中的字段必須小于或等于給定的 _字段 _。這兩個字段必須是相同的類型。字符串、數值、數組和文件大小的計算方式與 size 方法進行評估。
max:value
驗證中的字段必須小于或等于 value。字符串、數字、數組或是文件大小的計算方式都用 [size]規則。
:text/plain,…
驗證的文件必須具備與列出的其中一個擴展相匹配的 MIME 類型:
'video' => 'mimetypes:video/avi,video/mpeg,video/quicktime'
復制
為了確定上傳文件的 MIME,框架將會讀取文件,然后自動推測文件 MIME 類型表單驗證提示錯誤信息,這可能與客戶端提供的 MIME 類型不一致 。
mimes:foo,bar,…
驗證的文件必須具有與列出的其中一個擴展名相對應的 MIME 類型。
MIME 規則基本用法
'photo' => 'mimes:jpeg,bmp,png'
復制
即使你可能只需要驗證指定擴展名,但此規則實際上會去驗證文件的 MIME 類型,其通過讀取文件內容來推測它的 MIME 類型。
可以在以下鏈接中找到完整的 MIME 類型列表及相對應的擴展名: /repos/asf/httpd/htt...
min:value
驗證字段必須具有最小值。 字符串,數值,數組,文件大小的計算方式都與 [size]規則一致.
:foo,bar,…
驗證字段不能包含在給定的值的列表中。 使用 Rule::notIn 方法可以更流暢的構建這個規則:
use Illuminate\Validation\Rule;
Validator::make($data, [
'toppings' => [
'required',
Rule::notIn(['sprinkles', 'cherries']),
],
]);
復制
:
驗證字段必須與給定的正則表達式不匹配。
驗證時,這個規則使用 PHP 函數。指定的模式應遵循 所需的相同格式,也包括有效的分隔符。 例如: 'email' => ':/^.+$/i'.
注意: 當使用 regex / 模式時, 可能需要在數組中指定規則,而不是使用 | 分隔符 ,特別是在正則表達式包含 | 字符 的情況下。
驗證字段可以為 null。這在驗證基本數據類型時特別有用,例如可以包含空值的字符串和整數。
驗證字段必須為數值。
驗證中的字段必須與經過身份驗證的用戶的密碼匹配。您可以使用規則的第一個參數來指定身份驗證的「看守器」:
'password' => 'password:api'
復制
驗證字段必須存在于輸入數據中,但可以為空。
regex:
驗證字段必須與給定的正則表達式匹配。
驗證時,這個規則使用 PHP 的 函數。 指定的模式應遵循 所需的相同格式,也包括有效的分隔符。 例如: 'email' => ':/^.+$/i' 。
注意: 當使用 regex / 模式時, 可能需要在數組中指定規則,而不是使用 | 分隔符 ,特別是在正則表達式包含 | 字符 的情況下。
驗證的字段必須存在于輸入數據中,而不是空。如果滿足以下條件之一,則字段被視為「空」:
:,,,…
如果其它字段 為任一值 或 或 等(也可只有一個 ) ,則此驗證字段必須存在且不為空。
如果您需要構造更復雜的條件 規則, 您可以使用 Rule:: 方法。這個方法可以接受一個布爾值或是一個閉包函數,當傳遞閉包函數時,閉包函數應該返回 true 或 false ,以表明是否需要驗證此字段:
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;
}),
]);
復制
:,value,…
如果其它字段 不等于任一值 value ,則此驗證字段必須存在且不為空。
:foo,bar,…
在其他任一指定字段出現時,驗證的字段才必須存在且不為空。
:foo,bar,…
只有在其他指定字段全部出現時,驗證的字段才必須存在且不為空。
:foo,bar,…
在其他指定任一字段不出現時,驗證的字段才必須存在且不為空。
:foo,bar,…
只有在其他指定字段全部不出現時,驗證的字段才必須存在且不為空。
same:field
驗證字段必須與給定字段相匹配。
size:value
驗證字段必須與給定值的大小一致。對于字符串,value 對應字符數。對于數字,value 對應給定的整數值。對于數組,size 對應數組的 count 值。對于文件,size 對應文件大小(單位 kb)。
:foo,bar,…
驗證字段必須以給定值之一開頭。
驗證字段必須是一個字符串。如果允許這個字段為 null,需要給這個字段分配 規則。
驗證字段必須為符合 PHP 函數 _list 所定義的有效時區標識。
:table,,,
驗證字段在給定的數據庫表中必須是唯一的。
指定自定義列名:
選項可用于指定相應數據庫列的字段。 如果未指定 選項,則使用字段本身名稱。
'email' => 'unique:users,email_address'
復制
自定義數據庫連接
有時,你可能需要為驗證器創建的數據庫查詢設置自定義連接。上面的例子中,將 :users 設置為驗證規則,等于使用默認數據庫連接來查詢數據庫。如果要對其進行修改,請使用「點」語法來指定連接和表名:
'email' => 'unique:connection.users,email_address'
復制
強迫 規則忽略指定 ID :
有時,你可能希望在進行字段唯一性驗證時忽略指定 ID 。例如, 在「更新個人資料」頁面會包含用戶名、郵箱和地點。這時你會想要驗證更新的 E-mail 值是否唯一。如果用戶僅更改了用戶名字段而沒有改 E-mail 字段,就不需要拋出驗證錯誤,因為此用戶已經是這個 E-mail 的擁有者了。
使用 Rule 類定義規則來指示驗證器忽略用戶的 ID 。這個例子中通過數組來指定驗證規則,而不是使用 | 字符來分隔:
use Illuminate\Validation\Rule;
Validator::make($data, [
'email' => [
'required',
Rule::unique('users')->ignore($user->id),
],
]);
復制
{備注} 您永遠不應該將任何用戶控制的請求輸入傳遞給 方法。您應該只通過 模型的實例來傳遞系統生成的唯一 ID ,例如自動遞增 ID 或 UUID 。 否則,您的應用程序將更容易受到 SQL 注入攻擊。
您可以傳遞整個模型實例,而不是將模型實例的主鍵值 傳遞給 方法。 將自動從模型實例中獲取主鍵值:
Rule::unique('users')->ignore($user)
復制
如果您的數據表使用的主鍵名稱不是 id ,那就在調用 方法時指定字段的名稱:
Rule::unique('users')->ignore($user->id, 'user_id')
復制
默認情況下, 規則將檢查與要驗證字段名稱相匹配的列的唯一性。 但是,您可以傳遞一個不同的列名作為 方法的第二個參數:
Rule::unique('users', 'email_address')->ignore($user->id),
復制
增加額外的 Where 語句:
您也可以通過 where 方法指定額外的查詢條件。例如, 我們添加 為 1 的約束:
'email' => Rule::unique('users')->where(function ($query) {
return $query->where('account_id', 1);
})
復制
url
驗證的字段必須是有效的 URL。
uuid
驗證字段必須是有效的 RFC 4122(版本 1,3,4 或 5)通用唯一標識符(UUID)。
按條件增加規則存在時則驗證
在某些情況下,你可能希望將要驗證的字段存在于輸入數組中時,才對該字段執行驗證。可以在規則列表中增加 來實現:
$v = Validator::make($data, [
'email' => 'sometimes|required|email',
]);
復制
在上面的例子中, email 字段只有在 $data 數組中存在時才會被驗證。
Tip:如果你嘗試驗證應該始終存在但可能為空的字段,請查閱 [可選字段的注意事項]
復雜的條件驗證
有時候你可能需要增加基于更復雜的條件邏輯的驗證規則。例如,你可以希望某個指定字段在另一個字段的值超過 100 時才為必填。或者當某個指定字段存在時,另外兩個字段才能具有給定的值。增加這樣的驗證條件并不難。首先,使用 靜態規則 創建一個 實例:
$v = Validator::make($data, [
'email' => 'required|email',
'games' => 'required|numeric',
]);
復制
假設我們有一個專為游戲收藏家所設計的網頁應用程序。如果游戲收藏家收藏超過一百款游戲,我們會希望他們來說明下為什么他們會擁有這么多游戲。比如說他們有可能經營了一家游戲分銷商店,或者只是為了享受收集的樂趣。為了在特定條件下加入此驗證需求,可以在 實例中使用 方法。
$v->sometimes('reason', 'required|max:500', function ($input) {
return $input->games >= 100;
});
復制
傳入 方法的第一個參數是要用來驗證的字段名稱。第二個參數是我們想使用的驗證規則。 閉包 作為第三個參數傳入,如果其返回 true , 則額外的規則就會被加入。這個方法可以輕松地創建復雜的條件驗證。你甚至可以一次對多個字段增加條件驗證:
$v->sometimes(['reason', 'cost'], 'required', function ($input) {
return $input->games >= 100;
});
復制
Tip:傳入 閉包 的 $input 參數是 \\ 的一個實例,可用來訪問你的輸入或文件對象。
驗證數組
驗證表單的輸入為數組的字段也不難。你可以使用 「點」方法來驗證數組中的屬性。例如,如果傳入的 HTTP 請求中包含 [] 字段, 可以如下驗證:
$validator = Validator::make($request->all(), [
'photos.profile' => 'required|image',
]);
復制
你也可以驗證數組中的每個元素。例如,要驗證指定數組輸入字段中的每一個 email 是唯一的,可以這么做:
$validator = Validator::make($request->all(), [
'person.*.email' => 'email|unique:users',
'person.*.first_name' => 'required_with:person.*.last_name',
]);
復制
同理表單驗證提示錯誤信息,你可以在語言文件定義驗證信息時使用 * 字符,為基于數組的字段使用單個驗證消息:
'custom' => [
'person.*.email' => [
'unique' => 'Each person must have a unique e-mail address',
]
],
復制
自定義驗證規則使用規則對象
提供了許多有用的驗證規則;同時也支持自定義規則。注冊自定義驗證規則的方法之一,就是使用規則對象。可以使用 命令 make:rule 來生成新的規則對象。接下來,讓我們用這個命令生成一個驗證字符串是否是大寫的規則。 會將新的規則存放在 app/Rules 目錄中:
php artisan make:rule Uppercase
復制
一旦創建了規則,我們就可以定義它的行為。規則對象包含兩個方法: 和 。 方法接收屬性值和名稱,并根據屬性值是否符合規則而返回 true 或 false。 方法應返回驗證失敗時應使用的驗證錯誤消息:
/**
* 獲取驗證錯誤消息。
*
* @return string
*/
public function message()
{
return 'The :attribute must be uppercase.';
}
}
復制
當然, 如果你希望從翻譯文件中返回一個錯誤消息,你可以從 方法中調用輔助函數 trans:
/**
* 獲取驗證錯誤消息。
*
* @return string
*/
public function message()
{
return trans('validation.uppercase');
}
復制
一旦規則對象被定義好后,你可以通過將規則對象的實例和其他驗證規則一起來傳遞給驗證器:
use App\Rules\Uppercase;
$request->validate([
'name' => ['required', 'string', new Uppercase],
]);
復制
使用閉包
如果你在應用程序中只需要一次自定義規則的功能,則可以使用閉包代替規則對象。閉包接收屬性的名稱、屬性的值、失敗回調,如果驗證失敗需要調用 $fail:
$validator = Validator::make($request->all(), [
'title' => [
'required',
'max:255',
function ($attribute, $value, $fail) {
if ($value === 'foo') {
$fail($attribute.' is invalid.');
}
},
],
]);
復制
使用擴展
注冊自定義的驗證規則的另一種方法是使用 [] 中的 方法。讓我們在 [服務容器]中使用這個方法來注冊自定義驗證規則:
復制
自定義的驗證閉包接收四個參數:要被驗證的屬性名稱 、屬性的值 value、傳入驗證規則的參數數組
除了使用閉包,你也可以傳入類和方法到 方法中:
Validator::extend('foo', 'FooValidator@validate');
復制
定義錯誤消息
你還需要為自定義規則定義錯誤信息。你可以使用內聯自定義消息數組或者在驗證語言文件中添加條目來實現這一功能。 消息應該被放到數組的第一位, 而不是在只用于存放屬性指定錯誤信息的 數組內:
"foo" => "Your input was invalid!",
"accepted" => "The :attribute must be accepted.",
// 其余的驗證錯誤消息...
復制
當創建一個自定義驗證規則時,你可能有時候需要為錯誤信息定義自定義占位符。可以通過創建自定義驗證器然后調用 門面上的 方法。你可以在 [服務容器]的 boot 方法中執行如下操作:
/**
* 引導應用程序。
*
* @return void
*/
public function boot()
{
Validator::extend(...);
Validator::replacer('foo', function ($message, $attribute, $rule, $parameters) {
return str_replace(...);
});
}
復制
隱式擴展
默認情況下,當所要驗證的屬性不存在或包含一個空字符串時,使用包含自定義擴展的正常的驗證規則是不會執行的。例如,[] 規則將不會檢驗空字符串:
$rules = ['name' => 'unique:users,name'];
$input = ['name' => ''];
Validator::make($input, $rules)->passes(); // true
復制
如果即使屬性為空也要驗證規則,則一定要暗示屬性是必須的。要創建這樣一個「隱式」擴展,可以使用 ::() 方法:
Validator::extendImplicit('foo', function ($attribute, $value, $parameters, $validator) {
return $value == 'foo';
});
復制
注意:「隱式」擴展只暗示該屬性是必需的。至于它到底是缺失還是空值這取決于你。
隱式規則對象
如果你想要在屬性為空時執行規則對象,你應該實現 \\\ 接口。這個接口將充當驗證器的「標記接口」;因此,它不包含你要實現的任何方法。