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

Laravel框架表單驗證詳解

高洛峰
發布: 2016-12-27 10:55:33
原創
1334 人瀏覽過

基礎驗證範例

$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中文网!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門推薦
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板