Laravel 的表单验证解析

第一种validate

直接在控制器中使用

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

}

在第一次验证失败后停止

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

以上例子中,如果required没有通过,则不会检测到unique


验证失败后会返回错误响应,我们可以在视图中这样显示错误信息。

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

表单请求嵌套属性(数组)

如果你的 HTTP 请求包含一个 「嵌套的」 参数,你可以在验证规则中通过 「点」 语法来指定这些参数。

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

第二种表单请求验证

在更复杂的验证情境中,你可能会想要创建一个「表单请求( form request )」。表单请求是一个自定义的请求类,里面包含着验证逻辑。要创建一个表单请求类,可使用 Artisan 命令行命令 make:request

php artisan make:request StoreBlogPost,名字是自定义的

新生成的类保存在app/Http/Requests目录下,我们需要在此类里边的rules方法里添加验证规则:

/**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
        'title' => 'required|unique:articles|max:255',
        'body' => 'required|max:2',
        ];
    }

然后我们就可以在控制器里边执行验证了,利用类型提示来执行store(StoreBlogPost $request),传入的请求会在方法被调用之前就执行

use App\Http\Requests\StoreBlogPost;
// 千万不要忘记引入刚刚创建的验证文件,我就入了这个坑

public function store(StoreBlogPost $request)
{
    //不用
    //控制器执行逻辑
}

你还可以自定义错误信息,这需要在StoreBlogPost重写message方法:

public function messages()
{
    return [
        'title.required' => '标题必须填啊',
        'body.required'  => '内容也要填',
    ];
}

第三种 手动创建验证请求

在你的控制器中实现,手动创建一个 validator 实例并通过 Validator::make 方法在 Facade 生成一个新的 validator 实例:

use Validator;
// 这个use也是手动创建验证请求必须的,但这不是一个创建的文件,是生成的逻辑文件

public function store(Request $request)
{
        $validator = Validator::make($request->all(), [
            'title' => 'required|unique:articles|max:255',
            'body' => 'required',
        ]);
        if ($validator->fails()) {
            // 当验证失败后跳转到之前的页面,因为手动创建不能实现自动跳转
            return redirect()->back()
                        ->withErrors($validator)
                        ->withInput();
        } 

}

自动重定向

如果你手动创建验证请求之后,还希望使用ValidatesRequest的自动跳转方法,那么你可以调用一个现存的验证器实例中的 validate 方法:

        $validator = Validator::make($request->all(), [
            'title' => 'required|unique:articles|max:255',
            'body' => 'required',
        ])->validate();

当然手动也可以自定义错误信息

有几种方法可以指定自定义消息。首先,你需要先通过传递三个参数到 Validator::make 方法来自定义验证消息:

$messages = [
    'required' => 'The :attribute field is required.', //视图页面会生成,The "字段名称" field is required
];

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

在这个例子中,:attribute 占位符会被通过验证的字段实际名称所取代。除此之外,你还可以使用其它默认字段的验证提示消息。例如:

$messages = [
    'same'    => 'The :attribute and :other must match.',
    'size'    => 'The :attribute must be exactly :size.', // 生成The "字段名称" must be exactly "字段值的长度".
    'between' => 'The :attribute must be between :min - :max.',
    'in'      => 'The :attribute must be one of the following types: :values',
];

指定自定义消息到特定的属性:

$messages = [
    'title.required' => 'We need to know your e-mail address!',// 给标题添加错误信息
];

命名错误包

其实就是你可以在指定的表单上显示错误信息,官方解释:

如果你在一个一个页面中有多个表单,你也许会希望命名错误信息包 MessageBag ,错误信息包允许你从指定的表单中接收错误信息。简单的给 withErrors 方法传递第二个参数作为一个名字:
return redirect('register') ->withErrors($validator, 'login');

比如我的title字段错了,我只让title上显示错误信息:

        $validator = Validator::make($request->all(), [
            'title' => 'required|unique:articles|min:3', // 标题至少为3个字符
            'body' => 'required|min:10',
        ]);
        if ($validator->fails()) {
            return redirect()->back()
                        ->withErrors($validator, 'testTitle')
                        ->withInput();
        }   

// 这句是添加到视图里的
{{ $errors->testTitle->first('title') }}

执行如图:

验证后钩子

我们可以利用这添加错误信息
官方叙述:

验证器允许你在验证完成之后附加回调函数。这使得你可以容易的执行进一步验证,甚至可以在消息集合中添加更多的错误信息。使用它只需在验证实例中使用 after 方法:

$validator = Validator::make($request->all(), [
            'title' => 'required|unique:articles|min:3',
            'body' => 'required|min:10',
        ]);
        $validator->after(function ($validator) {

                $validator->errors()->add('field', '利用钩子添加错误信息!');

        });
        if ($validator->fails()) {
            return redirect()->back()
                        ->withErrors($validator, 'testTitle')
                        ->withInput();
        }   

执行如图:

还有很多验证属性,请参考官方文档,此文章只是根据自己理解结合官方文档写的,如有错误,请不吝指教

2 条评论

  1. 我来了

    1. victor
      @衡

      邮件测试完成!

发表评论