如何使用 Laravel 框架的 validator

Laravel Validation

Laravel’s base controller class use a ValidatesRequests trait

app/Http/routes.php :

Route::get(‘post/create’, ‘PostController@create’);

Route::post(‘post’, ‘PostController@store’);

Controller
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class PostController extends Controller
{
/**
* Show the form to create a new blog post.
*
* @return Response
*/
public function create()
{
return view('post.create');
}

/**
 * Store a new blog post.
 *
 * @param  Request  $request
 * @return Response
 */
public function store(Request $request)
{
    // Validate and store the blog post...
}

}

// 直接在 store 方法中,使用 base controller 中的 validatesRequests trait

public function store(Request $request)
{
$this->validate($request, [
'title' => 'required|unique:posts|max:255',
'body' => 'required',
]);

}
只需给 validate 方法,传送 HTTP request 与需要验证规则即可。
注意,如果验证失败,自动生成默认的提示。验证通过,控制器就会自动往下执行。

第一个验证规则失败,就停止继续往下验证,对该属性适应 bail 规则:

$this->validate($request,[
‘title’ => ‘bail | required | unique:posts|max:255’,
‘body’ => ‘required’
]);

上面的代码执行时,如果 title 在 required 规则验证没通过,那么 unique 规则将不再被验证。
验证规则会被按照指定的顺序来校验。

对嵌套属性使用验证规则补充说明

如果 HTTP request 包含有嵌套参数,你可以再验证规则中使用 “.” 语法来指定需要校验的参数,如:

$this->validate($request, [
‘title’ => ‘required|unique:post|max:255’,
‘author.name’ => ‘required’,
‘author.description’ => ‘required’,
]);

展示验证后生成的错误提示

如前面提及到的,如果参数校验不通过, Laravel 会自动重定向到来源 URL。另外,所有的验证错误就会被自动存入到 session 中。

不需要在 GET 路由中将错误信息绑定,Laravel 会自己检测 session,如果有错误就自动绑定到视图中。
$errors 变量是 Illuminate\Support\MessageBag 的实例。

在这个例子中,验证不通过,用户将会被重定向到控制器的 create 方法。我们就可以在视图中展示错误。

<h1>Create Post</h1>

@if (count($errors) > 0)
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif

自定义错误消息提醒格式

自定义验证不通过的错误消息,可以通过在基础控制器(base controller)重写 formatValidationErrors。
必须要先在文件顶部,引入 Illuminate\Contracts\Validation\Validator 类:

<?php

namespace App\Http\Controllers;

use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Contracts\Validation\Validator;
use Illuminate\Routing\Controller as BaseController;
use Illuminate\Foundation\Validation\ValidatesRequests;

abstract class Controller extends BaseController
{
use DispatchesJobs, ValidatesRequests;

/**
 * {@inheritdoc}
 */
protected function formatValidationErrors(Validator $validator)
{
    return $validator->errors()->all();
}

}

AJAX 请求与参数验证

上面例子,是针对使用表单(form)来传送数据给应用,大部分应用使用的是 AJAX 请求。

在一个 AJAX 请求中,使用 validate 方法,Laravel 将不会生成重定向响应。相反,Laravel 会生成一个包含验证错误提示的 JSON 响应。该响应会以 422 HTTP 状态码来发送回去给客户端。

校验输入字段的数组为数组格式

验证在每一个数组中的输入字段是唯一的,只需要

$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',
]
],

自己创建验证器

不想要使用 ValidatesRequests trait’s validate 方法,你可以通过使用 Validator facade 来创建一个 validator 实例。make 方法将会生成一个新的验证器实例。

<?php

namespace App\Http\Controllers;

use Validator;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class PostController extends Controller
{
/**
* Store a new blog post.
*
* @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();
    }

    // Store the blog post...
}

}

make 方法,第一参数是需要校验的数据,第二个参数是对数据进行校验的规则。

验证失败之后,可以使用 withErrors 方法来将错误提示存入会话中。同时,$errors 变量可以再跳转后,视图中使用。
withErrors 方法接收一个 validator, 一个 MessageBag,或一个 PHP 数组。

命名错误提示

单个页面有多个表单,你就会想要对错误提示命名,这样你可以指定接收处理某个指定表单的错误信息。
只要传送一个名字作为 withErrors 的第二个参数即可。

return redirect(‘register’)->withErrors($validator, ‘login’);

视图中通过 $errors 变量,来使用 MessageBag 实例:

{{ $errors->login->first(‘email’) }}

验证后提供的回调处理

validator 允许你指定回调函数,在验证完成之后就执行。这可以使你更容易进行深入的校验,甚至可以添加更多的错误提示。

只需要使用 validator 实例的 after 方法即可。

$validator = Validator::make(...);

$validator->after(function($validator) {
if ($this->somethingElseIsInvalid()) {
$validator->errors()->add('field', 'Something is wrong with this field!');
}
});

if ($validator->fails()) {
//
}



表单请求验证

为了应对更加复杂的验证场景,或许你会想要创建一个“ form request”。表单请求就是,自定义包含有验证逻辑的请求类。

使用 make:request Artisan 命令行命令 make:request,即可创建一个表单请求类:

php make make:request StoreBlogPostRequest

生成的类放置在 app/Http/Requests 目录。让我们添加几个验证规则到 rules 方法中:

public function rules()
{
return [
'title' => 'required|unique:posts|max:255',
'body' => 'required',
];
}

要怎么样才能让验证规则执行呢?所有你需要的就是,在对应的控制器方法中指定 request (type-hint the request on your controller method)。在控制器方法被调用前,输入的表单请求会先被验证,这就意味着你不需要将控制器代码与数据校验代码混在一起了。

public function store(StoreBlogPostRequest $request)
{
// The incoming request is valid...
}

验证失败,会有重定向响应,使用用户返回到来源 URL。错误提示会被保存到 session,可以直接在视图中进行使用展示。

如果请求是 AJAX, 返回 JSON 格式的验证错误提示,响应的HTTP状态码为 422 。

表单请求授权

表单请求类中,有 authorise 方法。在这个方法里面,你可以判断授权用户是否有权限去更新一个指定的资源。
如:一名用户想要更新一篇文章的评论,那需要检查他们是否就是该评论的所有者。

代码:

public function authorize()
{
$commentId = $this->route('comment');

return Comment::where('id', $commentId)
              ->where('user_id', Auth::id())->exists();

}

通过使用 route 方法来访问在路由中定义的 URI 参数,例如:{comment} 参数定义如下:

Route::post(‘comment/{comment}’);

如果 authorise 方法返回 false,状态码为 403 的响应会自动返回,控制器方法将不会被执行。

如果你想要,在应用的其他部分使用用户授权验证逻辑,只需要在 authorize 方法中返回 true 就好了。

自定义错误提示格式

如果你想要自定义验证失败后的错误提醒,只需要在 request 基类(App\Http\Requests\Request)中重写 formatErrors 方法。记得要在类文件顶部引入 Illuminate\Contracts\Validation\Validator。

protected function formatErrors(Validator $validator)
{
return $validator->errors()->all();
}

自定义错误提示内容

在表单请求类(app/Http/Requests/LightPostRequest.php)中,重写 message 方法。该方法必须要返回一个属性/规则对,与对应的错误的消息。

public function messages()
{
return [
'title.required' => 'A title is required',
'body.required' => 'A message is required',
];
}

使用错误提示信息

通过调用 Validator 实例的 errors 方法,你就可以使用 Illuminate\Support\MessageBag 实例,该实例提供一系列的便捷方法来操作错误提示信息。

使用一个字段的第一条错误信息

提取一个指定字段的第一条错误信息,使用 first 方法“

$message = $validator->error();

echo $message->first(‘email’);

提取一个字段的所有错误信息

$message->get(“email”);

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

提取所有字段的错误信息

$message->all();

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

判断某个字段时候存在错误信息

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

通过一个格式来提取错误提示

echo $message->first(‘email’, ‘<p>:message</p>’);

通过一个格式提取所有错误提示

foreach($message->all(‘<li>:message</li>’) as $message) {

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容

  • 1、简介 Laravel 提供了多种方法来验证应用输入数据。默认情况下,Laravel 的控制器基类使用Valid...
    伊Summer阅读 1,523评论 0 3
  • 验证 简介 Laravel 对验证应用的输入数据提供了多中途径的实现。默认的,Laravel 的基础控制器类使用了...
    Dearmadman阅读 10,198评论 5 8
  • 校园失物招领平台开发 ——基于laravel框架构建最小内容管理系统 摘要 ​ 针对目前大学校园人口密度大、人群活...
    蓝莲花xzsky阅读 6,176评论 8 54
  • 先说几句废话,调和气氛。事情的起由来自客户需求频繁变更,伟大的师傅决定横刀立马的改革使用新的框架(created ...
    wsdadan阅读 3,047评论 0 12
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,633评论 18 139