首頁 >php教程 >PHP开发 >Laravel框架表單驗證詳解

Laravel框架表單驗證詳解

高洛峰
高洛峰原創
2016-12-27 10:55:331333瀏覽

基礎驗證範例

$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 實例被創建,可以使用 fails (或 passes)函數執行這個驗證。

if ($validator->fails())
{
// The given data did not pass validation
}

如果驗證失敗,您可以從驗證器中取得錯誤訊息。

$messages = $validator->messages();

您也可以使用 failed 函數得到不帶錯誤訊息的沒有通過驗證的規則的陣列。

$failed = $validator->failed();

文件驗證

Validator 類別提供了一些驗證規則用於驗證文件,例如 size、mimes等。在驗證文件的時候,您可以和其他驗證一樣傳遞給驗證器。

附帶錯誤訊息

在一個 Validator 實例上呼叫 messages 函數之後,將會得到一個 MessageBag 實例,該實例擁有很多處理錯誤訊息的方便的函數。

取得一個域的第一個錯誤訊息

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

取得一個域的全部錯誤訊息

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

取得全部域的全部錯誤訊息

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

檢查一個域是否存在訊息

if ($messages->has('email'))
{
//
}
訊息

echo $messages->first(&#39;email&#39;, &#39;<p>:message</p>&#39;);

  注意: 預設情況下,訊息將使用與Bootstrap 相容的語法進行格式化。

  以某種格式獲取所有錯誤訊息

  foreach ($messages->all(&#39;<li>:message</li>&#39;) as $message)
  {
  //
  }

錯誤訊息 & 視圖

一旦您執行了驗證,您需要一種簡單的方法向視圖回饋錯誤訊息。這在 Lavavel 中能夠方便的處理。以下面的路由作為例子:

Route::get(&#39;register&#39;, function()
{
return View::make(&#39;user.register&#39;);
});
Route::post(&#39;register&#39;, function()
{
$rules = array(...);
$validator = Validator::make(Input::all(), $rules);
if ($validator->fails())
{
return Redirect::to(&#39;register&#39;)->withErrors($validator);
}
});

注意當驗證失敗,我們使用 withErrors 函數把 Validator 實例傳遞給 Redirect。這個函數將刷新 Session 中保存的錯誤訊息,使得下次請求中能夠可用。


然而,注意我們沒有必要明確的在 GET 路由中綁定錯誤訊息到路由。這是因為 Laravel 總是會檢查 Session 中的錯誤,並自動綁定它們到視圖如果它們是可用的。所以,對於每個請求,一個 $errors 變數在所有視圖中總是可用的,允許您方便的認為 $errors 總是被定義並且可以安全使用的。 $errors 變數將會是一個 MessageBag 類別的實例。

所以,在跳轉之後,您可以在視圖中使用自動綁定的$errors 變數:

<?php echo $errors->first(&#39;email&#39;); ?>

  可用的驗證規則

  下面是一個所有可用的驗證規則的列表以及它們的功能:

  下面

accepted

驗證此規則的值必須是yes、 on 或是1。這在驗證是否同意"服務條款"的時候非常有用。

active_url

驗證此規則的值必須是一個合法的 URL,根據 PHP 函數 checkdnsrr。

after:date

驗證此規則的值必須在給定日期之後,日期將透過 PHP 函數 strtotime 傳遞。

alpha

  驗證此規則的值必須全部由字母字元構成。

alpha_dash

  驗證此規則的值必須全部由字母、數字、中劃線或底線字元構成。

alpha_num

  驗證此規則的值必須全部由字母和數字構成。

before:date

  驗證此規則的值必須在給定日期之前,日期將透過 PHP 函數 strtotime 傳遞。

between:min,max

  驗證此規則的值必須在給定的 min 和 max 之間。字串、數字以及檔案都將使用大小規則進行比較。

confirmed

  驗證此規則的值必須和 foo_confirmation 的值相同。例如,需要驗證此規則的域是 password,那麼在輸入中必須有一個與之相同的 password_confirmation 域。

date

  驗證此規則的值必須是一個合法的日期,根據 PHP 函數 strtotime。

date_format:format

  驗證此規則的值必須符合給定的 format 的格式,根據 PHP 函數 date_parse_from_format。

different:field

  驗證此規則的值必須與指定的 field 域的值不同。

email

  驗證此規則的值必須是一個合法的電子郵件地址。

exists:table,column

  驗證此規則的值必須在指定的資料庫的表中存在。

  Exists 規則的基礎使用

Accepted
 Active URL
 After (Date)
 Alpha
 Alpha Dash
 Alpha Numeric
 Before (Date)
 Between
 Confirmed
 Date
 Date Format
 Different
 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 Without
 Same
 Size
 Unique (Database)

指定列名

&#39;state&#39; => &#39;exists:states&#39;

您也可以指定更多的條件,將以 "where" 的形式加入查詢。

&#39;state&#39; => &#39;exists:states,abbreviation&#39;

image

  驗證此規則的值必須是一個圖片 (jpeg, png, bmp 或 gif)。

  in:foo,bar,...

  驗證此規則的值必須在給定的清單中存在。

  integer

  驗證此規則的值必須是一個整數。

 

  驗證此規則的值必須是一個合法的 IP 位址。

max:value

  驗證此規則的值必須小於最大值 value。字串、數字以及檔案都將使用大小規則進行比較。

  mimes:foo,bar,...

  驗證此規則的文件的 MIME 類型必須在給定的清單中。

  MIME 规则的基础使用

&#39;photo&#39; => &#39;mimes:jpeg,bmp,png&#39;

min:value
  验证此规则的值必须大于最小值 value。字符串、数字以及文件都将使用大小规则进行比较。

not_in:foo,bar,...

  验证此规则的值必须在给定的列表中不存在。

numeric

  验证此规则的值必须是一个数字。

regex:pattern

  验证此规则的值必须符合给定的正则表达式。

  注意: 当使用 regex 模式的时候,有必要使用数组指定规则,而不是管道分隔符,特别是正则表达式中包含一个管道字符的时候。

required

  验证此规则的值必须在输入数据中存在。

required_if:field,value

  当指定的域为某个值的时候,验证此规则的值必须存在。

required_with:foo,bar,...

  仅当指定的域存在的时候,验证此规则的值必须存在。

required_without:foo,bar,...

  仅当指定的域不存在的时候,验证此规则的值必须存在。

same:field

  验证此规则的值必须与给定域的值相同。

size:value

验证此规则的值的大小必须与给定的 value 相同。对于字符串,value 代表字符的个数;对于数字,value 代表它的整数值,对于文件,value 代表文件以KB为单位的大小。

unique:table,column,except,idColumn

验证此规则的值必须在给定的数据库的表中唯一。如果 column 没有被指定,将使用该域的名字。

Unique 规则的基础使用

&#39;email&#39; => &#39;unique:users&#39;
指定列名
&#39;email&#39; => &#39;unique:users,email_address&#39;
强制忽略一个给定的 ID
&#39;email&#39; => &#39;unique:users,email_address,10&#39;

url

  验证此规则的值必须是一个合法的 URL。

  定制错误消息

  如果有需要,您可以使用定制的错误消息代替默认的消息。这里有好几种定制错误消息的方法。

  传递定制消息到验证器

$messages = array(
 &#39;required&#39; => &#39;The :attribute field is required.&#39;,
 );
 $validator = Validator::make($input, $rules, $messages);

注意: :attribute 占位符将被实际的进行验证的域的名字代替,您也可以在错误消息中使用其他占位符。

其他验证占位符

  $messages = array(
  &#39;same&#39; => &#39;The :attribute and :other must match.&#39;,
  &#39;size&#39; => &#39;The :attribute must be exactly :size.&#39;,
  &#39;between&#39; => &#39;The :attribute must be between :min - :max.&#39;,
  &#39;in&#39; => &#39;The :attribute must be one of the following types: 
:values&#39;,
  );

  有些时候,您可能希望只对一个指定的域指定定制的错误消息:

  对一个指定的域指定定制的错误消息

$messages = array(
&#39;email.required&#39; => &#39;We need to know your e-mail address!&#39;,
);

在一些情况下,您可能希望在一个语言文件中指定错误消息而不是直接传递给 Validator。为了实现这个目的,请在 app/lang/xx/validation.php 文件中添加您的定制消息到 custom 数组。

在语言文件中指定错误消息

&#39;custom&#39; => array(
&#39;email&#39; => array(
&#39;required&#39; => &#39;We need to know your e-mail address!&#39;,
),
),

定制验证规则

Laravel 提供了一系列的有用的验证规则;但是,您可能希望添加自己的验证规则。其中一种方法是使用 Validator::extend 函数注册定制的验证规则:

注册一个定制的验证规则

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

注意: 传递给 extend 函数的规则的名字必须符合 "snake cased" 命名规则。

  定制的验证器接受三个参数:待验证属性的名字、待验证属性的值以及传递给这个规则的参数。

  您也可以传递一个类的函数到 extend 函数,而不是使用闭包:

  Validator::extend(&#39;foo&#39;, &#39;FooValidator@validate&#39;);

  注意您需要为您的定制规则定义错误消息。您既可以使用一个行内的定制消息数组,也可以在验证语言文件中进行添加。

  您也可以扩展 Validator 类本身,而不是使用闭包回调扩展验证器。为了实现这个目的,添加一个继承自 Illuminate\Validation\Validator 的验证器类。您可以添加在类中添加以 validate 开头的验证函数:

扩展验证器类

<?php
class CustomValidator extends Illuminate\Validation\Validator {
public function validateFoo($attribute, $value, $parameters)
{
return $value == &#39;foo&#39;;
}
}

下面,您需要注册定制的验证器扩展:

您需要注册定制的验证器扩展

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(&#39;:foo&#39;, $parameters[0], $message);
}

更多Laravel框架表单验证详解相关文章请关注PHP中文网!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn