Laravel 的 Validation 檢索驗證錯誤訊息

OnlyDawn發表於2019-12-23
  • 基本用法
  • 處理錯誤訊息
  • 錯誤訊息和檢視
  • 可用的驗證規則
  • 有條件地新增規則
  • 自定義錯誤訊息
  • 自定義驗證規則

基本用法

Laravel提供了一個簡單、方便的工具,用於驗證資料並透過validation類檢索驗證錯誤訊息。

基本驗證示例
$validator = Validator::make(
    array('name' => 'Dayle'),
    array('name' => 'required|min:5')
);

傳遞給make方法的第一個引數是正在驗證的資料。第二個引數是應該應用於資料的驗證規則。

使用陣列指定規則

可以使用“管道”字元或作為陣列的單獨元素來分隔多個規則。

$validator = Validator::make(
    array('name' => 'Dayle'),
    array('name' => array('required', 'min:5'))
);
驗證多個欄位
$validator = Validator::make(
    array(
        'name' => 'Dayle',
        'password' => 'lamepassword',
        'email' => 'email@example.com'
    ),
    array(
        'name' => 'required',
        'password' => 'required|min:8',
        'email' => 'required|email|unique:users'
    )
);

建立驗證程式例項後,可以使用fails(或passes)方法執行驗證。

if ($validator->fails())
{
    //  給定的資料未透過驗證 
}

如果驗證失敗,您可以從驗證器檢索錯誤訊息。

$messages = $validator->messages();

您還可以訪問一組失敗的驗證規則,而無需訊息。為此,請使用失敗的方法:

$failed = $validator->failed();
正在驗證檔案

Validator類提供了一些用於驗證檔案的規則,例如大小、mime和其他規則。在驗證檔案時,您可以簡單地將它們與其他資料一起傳遞到驗證器中。

處理錯誤訊息

在對驗證器例項呼叫了messages方法之後,您將收到一個MessageBag例項,該例項有各種方便的方法來處理錯誤訊息。

檢索欄位的第一條錯誤訊息
echo $messages->first('email');
檢索欄位的所有錯誤訊息
foreach ($messages->get('email') as $message)
{
    //
}
檢索所有欄位的所有錯誤訊息
foreach ($messages->all() as $message)
{
    //
}
確定欄位是否存在訊息
if ($messages->has('email'))
{
    //
}
檢索格式為的錯誤訊息
echo $messages->first('email', '<p>:message</p>');

注意:預設情況下,訊息使用與載入程式相容的語法格式化。

檢索格式為的所有錯誤訊息
foreach ($messages->all('<li>:message</li>') as $message)
{
    //
}

錯誤訊息和檢視

一旦執行了驗證,就需要一種簡單的方法將錯誤訊息返回到檢視中。這是拉勒維爾很方便處理的。以下列路線為例:

Route::get('register', function()
{
    return View::make('user.register');
});

Route::post('register', function()
{
    $rules = array(...);

    $validator = Validator::make(Input::all(), $rules);

    if ($validator->fails())
    {
        return Redirect::to('register')->withErrors($validator);
    }
});

注意,當驗證失敗時,我們使用withErrors方法將驗證程式例項傳遞給重定向。此方法將錯誤訊息重新整理到會話,以便在下次請求時可用。

但是,請注意,我們不必顯式地將錯誤訊息繫結到GET路由中的檢視。這是因為Laravel將始終檢查會話資料中的錯誤,並自動將它們繫結到檢視(如果它們可用)。因此,需要注意的是,在您的所有檢視中,每次請求時都會有一個$errors變數, 允許您方便地假設$errors變數始終是定義的並且可以安全地使用。$errors變數將是MessageBag的一個例項。

因此,重定向後,可以在檢視中使用自動繫結的$errors變數:

<?php echo $errors->first('email'); ?>
命名錯誤包

如果在一個頁面上有多個表單,您可能希望命名錯誤訊息包。這將允許您檢索特定表單的錯誤訊息。只需將名稱作為第二個引數傳遞給withErrors

return Redirect::to('register')->withErrors($validator, 'login');

然後,您可以從$errors變數訪問命名的MessageBag例項:

<?php echo $errors->login->first('email'); ?>

可用的驗證規則

以下是所有可用驗證規則及其功能的列表:

  • Accepted
  • Active URL
  • After (Date)
  • Alpha
  • Alpha Dash
  • Alpha Numeric
  • Array
  • Before (Date)
  • Between
  • Boolean
  • Confirmed
  • Date
  • Date Format
  • Different
  • Digits
  • Digits Between
  • E-Mail
  • Exists (Database)
  • Image (File)
  • In
  • Integer
  • IP Address
  • Max
  • MIME Types
  • Min
  • Not In
  • Numeric
  • Regular Expression
  • Required
  • Required If
  • Required With
  • Required With All
  • Required Without
  • Required Without All
  • Same
  • Size
  • String
  • Timezone
  • Unique (Database)
  • URL
accepted

正在驗證的欄位必須是yes、on或1。這對於驗證“服務條款”接受是有用的。

active_url

根據checkdnsrr PHP函式,正在驗證的欄位必須是有效的URL。

after:date

正在驗證的欄位必須是給定日期之後的值。日期將傳遞到PHP strtotime函式中。

alpha

正在驗證的欄位必須完全是字母字元。

alpha_dash

正在驗證的欄位可能包含字母數字字元以及破折號和下劃線。

alpha_num

正在驗證的欄位必須完全是字母數字字元。

array

正在驗證的欄位必須是陣列型別。

before:date

正在驗證的欄位必須是給定日期之前的值。日期將傳遞到PHP strtotime函式中。

between:min,max

正在驗證的欄位的大小必須介於給定的最小值和最大值之間。字串、數字和檔案的計算方式與大小規則相同。

boolean

驗證中的欄位必須能夠轉換為布林值。接受的輸入為true、false、1、0、“1”和“0”。

confirmed

正在驗證的欄位必須有一個匹配的foo_confirmation欄位。例如,如果正在驗證的欄位是password,則輸入中必須存在匹配的password_confirmation欄位。

date

根據strtotime PHP函式,正在驗證的欄位必須是有效日期。

date_format:format

正在驗證的欄位必須與根據date_parse_from_format PHP函式定義的格式匹配。

different:field

給定欄位必須與正在驗證的欄位不同。

digits:value

正在驗證的欄位必須是數字,並且必須具有精確的值長度。

digits_between:min,max

正在驗證的欄位的長度必須介於給定的最小值和最大值之間。

email

正在驗證的欄位必須格式化為電子郵件地址。

exists:table,column

正在驗證的欄位必須存在於給定的資料庫表中。

Basic Usage Of Exists Rule
'state' => 'exists:states'
Specifying A Custom Column Name
'state' => 'exists:states,abbreviation'

您還可以指定更多將新增為查詢的“where”子句的條件:

'email' => 'exists:staff,email,account_id,1'

NULL作為“where”子句值傳遞將新增對空資料庫值的檢查:

'email' => 'exists:staff,email,deleted_at,NULL'
image

正在驗證的檔案必須是影像(jpeg、png、bmp或gif)

in:foo,bar,...

驗證中的欄位必須包含在給定的值列表中。

integer

正在驗證的欄位必須具有整數值。

ip

正在驗證的欄位必須格式化為IP地址。

max:value

驗證中的欄位必須小於或等於最大值。字串、數字和檔案的計算方式與大小規則相同。

mimes:foo,bar,...

正在驗證的檔案必須具有與列出的副檔名之一對應的MIME型別。

Basic Usage Of MIME Rule
'photo' => 'mimes:jpeg,bmp,png'
min:value

正在驗證的欄位必須具有最小值。字串、數字和檔案的計算方式與大小規則相同。

not_in:foo,bar,...

正在驗證的欄位不能包含在給定的值列表中。

numeric

正在驗證的欄位必須有一個數值。

regex:pattern

正在驗證的欄位必須與給定的正規表示式匹配。

注意:使用regex模式時,可能需要在陣列中指定規則,而不是使用管道分隔符,特別是當正規表示式包含管道字元時。

required

輸入資料中必須存在正在驗證的欄位。

required_if:field,value,...

如果欄位欄位等於任何值,則必須存在正在驗證的欄位。

required_with:foo,bar,...

只有當任何其他指定欄位存在時,驗證中的欄位才必須存在。

required_with_all:foo,bar,...

只有當所有其他指定欄位都存在時,驗證中的欄位才必須存在。

required_without:foo,bar,...

只有當其他指定欄位不存在時,驗證中的欄位才必須存在。

required_without_all:foo,bar,...

只有當所有其他指定欄位都不存在時,驗證中的欄位才必須存在。

same:field

給定欄位必須與正在驗證的欄位匹配。

size:value

正在驗證的欄位必須具有與給定值匹配的大小。對於字串資料,值對應於字元數。對於數字資料,值對應於給定的整數值。對於檔案,大小對應於以千位元組為單位的檔案大小。

string:value

正在驗證的欄位必須是字串型別。

timezone

根據時區識別符號列表PHP函式,正在驗證的欄位必須是有效的時區識別符號。

unique:table,column,except,idColumn

在給定的資料庫表中,要驗證的欄位必須是唯一的。如果未指定column選項,則將使用欄位名。

Basic Usage Of Unique Rule
'email' => 'unique:users'
Specifying A Custom Column Name
'email' => 'unique:users,email_address'
Forcing A Unique Rule To Ignore A Given ID
'email' => 'unique:users,email_address,10'
Adding Additional Where Clauses

您還可以指定更多將新增為查詢的“where”子句的條件:

'email' => 'unique:users,email_address,NULL,id,account_id,1'

在上述規則中,只有帳戶id為1的行才會包含在唯一檢查中。

url

正在驗證的欄位必須格式化為URL。

注意:此函式使用PHP的filter was方法。

有條件地新增規則

在某些情況下,您可能希望僅當輸入陣列中存在某個欄位時才對該欄位執行驗證檢查。要快速完成此操作,請將“有時”規則新增到規則列表中:

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

在上面的示例中,只有當電子郵件欄位出現在$data陣列中時,才會對其進行驗證。

複雜條件驗證

有時,僅當另一個欄位的值大於100時,才需要給定的欄位。或者,只有當存在另一個欄位時,才需要兩個欄位具有給定值。新增這些驗證規則不一定很麻煩。首先,使用靜態規則建立一個驗證程式例項,這些規則永遠不會更改:

$v = Validator::make($data, array(
    'email' => 'required|email',
    'games' => 'required|numeric',
));

假設我們的web應用程式是為遊戲收藏者設計的。如果一個遊戲收集器在我們的應用程式中註冊,並且他們擁有100多個遊戲,我們希望他們解釋為什麼他們擁有這麼多遊戲。例如,也許他們經營一家遊戲轉賣店,或者他們只是喜歡收藏。為了有條件地新增這個需求,我們可以在驗證器例項上使用有時方法。

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

傳遞給有時方法的第一個引數是我們要條件驗證的欄位的名稱。第二個引數是我們要新增的規則。如果作為第三個引數傳遞的閉包返回true,則將新增規則。這種方法使得建立複雜的條件驗證變得輕而易舉。您甚至可以同時為多個欄位新增條件驗證:

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

注意:傳遞給閉包的$input引數將是Illuminate\Support\Fluent的例項,可以用作訪問輸入和檔案的物件。

自定義錯誤訊息

如果需要,可以使用自定義錯誤訊息進行驗證,而不是使用預設值。有幾種方法可以指定自定義訊息。

將自定義訊息傳遞到驗證器
$messages = array(
    'required' => 'The :attribute field is required.',
);

$validator = Validator::make($input, $rules, $messages);

注意:屬性佔位符將替換為被驗證欄位的實際名稱。您還可以在驗證訊息中使用其他佔位符。

其他驗證場所持有人
$messages = array(
    'same'    => 'The :attribute and :other must match.',
    'size'    => 'The :attribute must be exactly :size.',
    'between' => 'The :attribute must be between :min - :max.',
    'in'      => 'The :attribute must be one of the following types: :values',
);
為給定屬性指定自定義訊息

有時您可能希望僅為特定欄位指定自定義錯誤訊息:

$messages = array(
    'email.required' => 'We need to know your e-mail address!',
);
在語言檔案中指定自定義訊息

在某些情況下,您可能希望在語言檔案中指定自定義訊息,而不是將它們直接傳遞給驗證器。為此,請將訊息新增到app/lang/xx/validation.php語言檔案中的自定義陣列中。

'custom' => array(
    'email' => array(
        'required' => 'We need to know your e-mail address!',
    ),
),

自定義驗證規則

註冊自定義驗證規則

Laravel提供了各種有用的驗證規則;但是,您可能希望指定一些自己的驗證規則。註冊自定義驗證規則的一種方法是使用Validator::extend方法:

Validator::extend('foo', function($attribute, $value, $parameters)
{
    return $value == 'foo';
});

自定義驗證器閉包接收三個引數:正在驗證的$attribute的名稱、屬性的$value$param陣列

您還可以將類和方法傳遞給擴充套件方法而不是閉包:

Validator::extend('foo', 'FooValidator@validate');

請注意,您還需要為自定義規則定義錯誤訊息。可以使用內聯自定義訊息陣列或透過在驗證語言檔案中新增條目來執行此操作。

擴充套件驗證器類

與使用閉包回撥來擴充套件驗證器不同,您還可以擴充套件驗證器類本身。為此,請編寫一個擴充套件Illuminate\Validation\Validator的驗證程式類。可以透過將驗證方法新增到類中,然後用驗證:

<?php

class CustomValidator extends Illuminate\Validation\Validator {

    public function validateFoo($attribute, $value, $parameters)
    {
        return $value == 'foo';
    }

}
註冊自定義驗證器解析程式

接下來,您需要註冊您的自定義驗證器擴充套件:

Validator::resolver(function($translator, $data, $rules, $messages)
{
    return new CustomValidator($translator, $data, $rules, $messages);
});

建立自定義驗證規則時,有時可能需要為錯誤訊息定義自定義佔位符替換。您可以透過建立自定義驗證器(如上所述)並向驗證器新增replaceXXX函式來完成此操作。

protected function replaceFoo($message, $attribute, $rule, $parameters)
{
    return str_replace(':foo', $parameters[0], $message);
}

如果要新增自定義訊息“replacer”而不擴充套件Validator類,可以使用Validator::replacer方法:

Validator::replacer('rule', function($message, $attribute, $rule, $parameters)
{
    //
});
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章