背景:广告系统注册用户表单验证
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
public function postRegister(Request $request){ if($request->isMethod('post')){ //验证提交的注册信息 $rules = [ 'nickname' =>'required|between:2,13', 'email' =>'required|email|unique:users', 'password' =>'required|alpha_dash|confirmed|between:6,15', 'code' =>'required', ]; //创建验证器 $validator = \Validator::make($request->all(), $rules); if($validator->fails()){ $error_msg = $validator->errors()->toArray(); return View::make('register', [ 'errors' => $error_msg ]); } $code = $request->input('code'); if(isset($code)){ $credential = [ 'nickname' => $request->input('nickname'), 'email' => $request->input('email'), 'password' => $request->input('password'), ]; $user = Sentinel::registerAndActivate($credential); $role = Sentinel::findRoleById(9); $role->users()->attach($user); return redirect('account/login')->with('status', '注册成功请登录!'); }else{ return redirect('account/register')->with('status', '邀请码不对注册失败!'); } }else{ return redirect('/account/register'); } } |
validata验证类的使用
可用的验证规则
regex:pattern(正则)
验证此规则的值必须符合给定的正则表达式。
accepted(yes|no|1)
验证此规则的值必须是 yes、 on 或者是 1。这在验证是否同意”服务条款”的时候非常有用。
in:foo,bar,…(in 规则)
验证此规则的值必须在给定的列表中存在。
notin:_foo,bar,…(not in 规则)
验证此规则的值必须在给定的列表中不存在。
alpha(全部字母)
验证此规则的值必须全部由字母字符构成。
numeric(数字)
验证此规则的值必须是一个数字。
alpha_num(字母|数字)
验证此规则的值必须全部由字母和数字构成。
alpha_dash(字母|数字|中划线|下划线)
验证此规则的值必须全部由字母、数字、中划线或下划线字符构成。
url(合法 URL,不严谨)
验证此规则的值必须是一个合法的 URL。
注意: 已经证实此规则不严谨,类似 2http://url.com 的 URL 可以通过验证。
active_url(合法 URL,基于 checkdnsrr)
验证此规则的值必须是一个合法的 URL,根据 PHP 函数 checkdnsrr。
注意: 由于是基于 checkdnsrr 因此也可用于验证邮箱地址是否存在。
email(电子邮件)
验证此规则的值必须是一个合法的电子邮件地址。
image (jpeg|png|bmp|gif)
验证此规则的值必须是一个图片 (jpeg, png, bmp 或者 gif)。
integer(整数)
验证此规则的值必须是一个整数。
ip(IP 地址)
验证此规则的值必须是一个合法的 IP 地址。
before:date(给定日期之前)
验证此规则的值必须在给定日期之前,日期将通过 PHP 函数 strtotime 传递。
after:date(给定日期之后)
验证此规则的值必须在给定日期之后,日期将通过 PHP 函数 strtotime 传递。
between:min,max(min 和 max 之间)
验证此规则的值必须在给定的 min 和 max 之间。字符串、数字以及文件都将使用大小规则进行比较。
confirmed(二次确认域,如“密码的二次确认域”)
验证此规则的值必须和 foo_confirmation 的值相同。比如,需要验证此规则的域是 password,那么在输入中必须有一个与之相同的 password_confirmation 域。
same:field(值与给定域相同)
验证此规则的值必须与给定域的值相同。
size:value(大小与给定域的值相同)
验证此规则的值的大小必须与给定的 value 相同。
对于字符串,value 代表字符的个数,
对于数字,value 代表它的整数值,
对于文件,value 代表文件以KB为单位的大小。
date(合法日期字符串,基于 strtotime)
验证此规则的值必须是一个合法的日期,根据 PHP 函数 strtotime。
dateformat:_format(format 格式 y-m-d H:i:s)
验证此规则的值必须符合给定的 format 的格式,根据 PHP 函数 date_parse_from_format。
different:field(不同于)
验证此规则的值必须与指定的 field 域的值不同。
min:value(最小值)
验证此规则的值必须大于最小值 value。字符串、数字以及文件都将使用大小规则进行比较。
max:value(最大值)
验证此规则的值必须小于最大值 value。字符串、数字以及文件都将使用大小规则进行比较。
mimes:foo,bar,…(MIME 类型限制)
验证此规则的文件的 MIME 类型必须在给定的列表中。
MIME 规则的基础使用
1 |
'photo' => 'mimes:jpeg,bmp,png' |
注意: 当使用 regex 模式的时候,有必要使用数组指定规则,而不是管道分隔符,特别是正则表达式中包含一个管道字符的时候。
required(必填)
验证此规则的值必须在输入数据中存在。
requiredif:_field,value(当指定域为某个值时,必填)
当指定的域为某个值的时候,验证此规则的值必须存在。
requiredwith:_foo,bar,…(当指定域存在时,必填)
仅当指定的域存在的时候,验证此规则的值必须存在。
requiredwithout:_foo,bar,…(当指定域不存在时,必填)
仅当指定的域不存在的时候,验证此规则的值必须存在。
exists:table,column(必须存在于 table 表的 column 字段数据中)
验证此规则的值必须在指定的数据库的表中存在。
Exists 规则的基础使用
1 |
'state' => 'exists:states' |
指定列名
1 |
'state' => 'exists:states,abbreviation' |
您也可以指定更多的条件,将以 “where” 的形式添加到查询。
1 |
'email' => 'exists:staff,email,account_id,1' |
unique:table,column,except,idColumn(数据库唯一)
验证此规则的值必须在给定的数据库的表中唯一。如果 column 没有被指定,将使用该域的名字。
Unique 规则的基础使用
1 |
'email' => 'unique:users' |
指定列名
1 |
'email' => 'unique:users,email_address' |
强制忽略一个给定的 ID
1 |
'email' => 'unique:users,email_address,10' |
添加额外的where语句
你还可以指定更多条件,这些条件将被添加到查询的”where”语句中:
1 |
'email' => 'unique:users,email_address,NULL,id,account_id,1 |
在上面的规则中,只有account_id 为 1 的行才会被包含到unique检查中。
如何获取错误消息
构造为 JSON 数据(API)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
Route::post(<span class="hljs-string">'/registration', <span class="hljs-function"><span class="hljs-keyword">function<span class="hljs-params">() { <span class="hljs-comment">// 获取全部提交数据 $data = Input::all(); // 构造规则数组 $rules = array( 'username' => 'alpha_num' ); // 开始验证 $validator = Validator::make($data, $rules); if ($validator->passes()) { // 验证通过 return 'Data was saved.'; } // 验证失败 // 获取错误消息 $errors = $validator->messages(); // 构造 JSON 响应 return Response::json($errors); }); </span></span></span></span></span> |
重定向,直接传递至下一个页面
1 2 |
return Redirect::to(<span class="hljs-string">'/')->withErrors($validator); </span> |
视图中如何获取传递过来的错误消息
注意: $errors 是系统预定义变量,任何模板中均可使用。
获取一个域的第一个错误消息
1 2 |
{{ $errors->first(<span class="hljs-name">'username') }} </span> |
获取一个域的全部错误消息
1 2 3 4 |
@<span class="hljs-keyword">foreach($errors->get(<span class="hljs-string">'username') as $message) <li>{{ $message }}</li> @endforeach </span></span> |
获取全部域的全部错误消息
1 2 3 4 |
@<span class="hljs-keyword">foreach($errors->all() as $message) <li>{{ $message }}</li> @endforeach </span> |
检查一个域是否存在消息
1 2 3 4 |
<span class="hljs-variable">@if($errors->has(<span class="hljs-string">'email')) <p>Yey, an error!</p> @endif </span></span> |
以某种格式获取一条错误消息
1 2 |
{{ $errors->first(<span class="hljs-name">'username', '<span class=<span class="hljs-string">"error">:message</span>') }} </span></span> |
注意: 默认情况下,消息将使用与 Bootstrap 兼容的语法进行格式化。
以某种格式获取所有错误消息
1 2 3 4 |
@<span class="hljs-keyword">foreach($errors->all(<span class="hljs-string">'<li>:message</li>') as $message) {{ $message }} @endforeach </span></span> |
定制验证规则
注意: 匿名函数 和 指向普通类方法 的 规则扩展 并不推荐,因此直接介绍如何直接扩展官方的验证器。
编写扩展验证器类:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<span class="hljs-class"><span class="hljs-keyword">class <span class="hljs-title">ExValidator extends Illuminate\Validation\Validator { <span class="hljs-comment">// 规则 public <span class="hljs-function">function validateFoo<span class="hljs-params">($attribute, $value, $parameters) { return $value == <span class="hljs-string">'foo'; } // 消息 protected function replaceFoo($message, $attribute, $rule, $parameters) { return str_replace(':foo', $parameters[<span class="hljs-number">0], $message); } } </span></span></span></span></span></span></span></span> |
注册定制的验证器扩展:
1 2 3 4 5 |
Validator::resolver(<span class="hljs-function"><span class="hljs-keyword">function<span class="hljs-params">($translator, $data, $rules, $messages) { return new ExValidator($translator, $data, $rules, $messages); }); </span></span></span> |
详细的编写方法请参照官方类 /vendor/laravel/framework/src/Illuminate/Validation/Validator.php 。
定制验证消息
针对某一个验证规则:
1 2 3 4 5 |
$messages = <span class="hljs-keyword">array( <span class="hljs-string">'required' => 'The :attribute field is required.', ); $validator = Validator::make($input, $rules, $messages); </span></span> |
针对指定域的某一规则:
1 2 3 4 |
$messages = <span class="hljs-keyword">array( <span class="hljs-string">'email.required' => 'We need to know your e-mail address!', ); </span></span> |
在语言文件中定义 /app/lang/zh-CN/validation.php:
1 2 3 4 5 |
<span class="hljs-string">'custom' => <span class="hljs-keyword">array( 'email' => array( 'required' => '请填写您的 email 地址。', ), ),</span></span> |
转载请注明:PHP笔记 » Laravel中validate验证类在实际项目中的使用