Laravel教程 七:表单验证 Validation

JellyBool

JellyBool

终于要更新这个Laravel系列教程的第七篇了,期间去写了一点其他的东西。

就不
说废话了吧,直接进入Form Validation的部分吧。几乎在每一个web应用当中都会有表单,而有表单基本就离不开表单验证。在laravel中,其实可以说是有两种方式来进行表单验证:使用Request和使用Validation。下面将分开讲这两部分的内容,而且我会更着重第一种,也更推荐大家使用第一种

Request表单验证

为什么说是会把精力都放在讲解第一种验证方式呢?因为个人觉得第一种方式在相同的验证条件下,更加易于维护和可以进行代码重用。而且写代码的形式
更适
用于Laravel和我个人的使用习惯:可以使用命令行来生成代码。也就是可以使用artisan这个工具:

替代文字

php artisan make:request StoreArticleRequest

在项目目录下使用artisan的make:request命令就可以生成一个用于表单验证Request类了,这个类我们在这里命名为StoreArticleRequest,你也可以以你自己喜欢的方式来命名,但我还是推荐大家在命名的时候尽量使得名字比较人性化一点,这样会比较对于后期再看代码的时候有很多好处。这个命令生成的文件位于app/Http/Requests/这个文件夹当中,我们打开这个文件来看:

class StoreArticleRequest extends Request
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return false;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            //
        ];
    }
}

实现验证

可以看到里面会有两个方法:authorize()rules()authorize()可以这样简单地理解:我们在处理这个表单请求(通常是一个post请求)的时候是否是需要进行身份验证,这种验证是指:比如A发表的评论,B能不能进行编辑。如果不能,则保留返回false,如果可以,则修改返回true。那么我们这里的逻辑是:既然是发表文章,在我们这个站点注册的用户(如果开放注册的话)都是可以发表文章的,所以我们首先修改authorize()方法,将其返回值改为:return true;

然后对于rules()方法,我们需要在这里设置我们的验证规则,比如我们可以设置下面这个的验证规则:

public function rules()
    {
        return [
            'title' => 'required',
            'content' => 'required'
        ];
    }

因为我们在创建文章的时候,我们会有两个提交过来的字段:titlecontent。这是我们在设计articles表的时候设置的两个字段。

然后,上面的验证规则是:对于titlecontent两个字段,我们需要用户为其填充内容,不能为空。

既然这里的规则设置好之后,我们该怎么应用起来呢?也就是我们怎么在将文章存入数据库之前进行验证呢?很简单,我们只需要稍微修改ArticleControllerstore()方法:

替代文字

public function store(Requests\StoreArticleRequest $request)
    {
        $input = $request->all();
        //下面增加两行,顺便看看Request::get的使用
        $input['intro'] = mb_substr($request->get('content'),0,64);
     }   

我们将整个StoreArticleRequest类的实例以$request变量传入store()方法,这个时候,laravel
就会自动检查我们是否需要进行表单验证(rules方法有没有定义验证规则),如果有需要验证的话,laravel会首先走验证这条路,如果验证没有通过,store()方法内的代码不会被执行,而是直接跳转到提交表单的页面,这里是:http://blog.dev/article/create 这个页面。如果所有的验证都通过之后,才会执行store()内部的代码,也就是才会执行到$input = $request->all();这里以及往下的代码。。。比如我们来试试留空的时候是什么样的情况:

替代文字

反馈错误

上面的图片中好像没有什么变化,但其实是已经提交了一次了,但是又马上跳转回来了。我们可以使用下面的方式来验证一下:

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

create.blade.php这个视图文件中增加上面的代码,我这里是放在{!! Form::close() !!}后面。这里的意思大概就是,如果有任何表单验证的错误消息,我们就讲这个信息打印出来反馈给用户。如果没有,则不会显示信息。我们再来试一下:

替代文字

这时候可以看到,我们在表单验证没有通过的时候,在页面显示了相对应的错误信息。如果没有错误,就创建一篇文章。

tips:如果你不想错误信息为英文,可以到resources/lang/en/validation.php修改,或者你直接创建一个新的语言文件包。

多个验证规则

OK,这里,我们基本是将这个这个验证流程走通了。但是,在实际的开发中,我们的验证并不都是这个简单:要是我们要对一个字段设置多个验证规则呢?比如我们希望文章的title最少不能少于三个字节长度呢?我们可以这样,在rules()方法中:

'title' => 'required|min:3',

在laravel中,我们使用|将多个规则分开,:表示规则的值。其实这里你也可以使用数组的,但是我还是推荐大家像上面这样写,简洁明了。

其他常用验证规则

至于更多地验证规则,比如注册的时候,验证一个email和确认密码的时候,我们怎么需要怎么写的呢?

'email'=>'required|email',
'password'=>'required|min:6|confirmed',
'password_confirmation' => 'required|min:6'

上面我直接给出这两个常用场景的最常见的写法,email就代表验证所填的信息是否是一个正确地邮箱格式了,至于确认密码就使用confirmed来指定,这里注意是confirmed而不是confirme。而且第二次输入密码的字段需要写成password_confirmation这个形式,也就是在视图中,我们会有类似这样的input表单:

<input type="password" name="password" />
<input type="password" name="password_confirmation" />

关于更多验证规则,参考官方文档:

http://laravel.com/docs/5.1/validation

使用Validation

使用这个之前可以将store(Requests\StoreArticleRequest $request)中的变量去掉

使用Validation的时候,多用于验证一些简单的表单验证。这里演示直接写于ArticleController当中,直接使用Validator::make(),使用方式为Validator::make(array $request,array $rules),比如说我们的例子可以在store()中写成:

$input = Request::all();
$validator = Validator::make($input, [
    'title' => 'required|min:3',
    'body' => 'required',
]);   

然后可以使用下面这样的方式来检查验证有没有通过:

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

验证通过之后,我们才进行下一步操作,比如将数据存入数据库。一个基本的Validation流程就完成了,而且关于Validation的部分,我也只想介绍到这里,因为我会安利大家使用第一种方式:Request。

tips:这两种方式的背后都是使用一样的验证机制。

总结

这里就基本将基础的表单验证说完了,下一节我准说说queryScope和SetAttributes的使用,这两个对于我们的数据入库的预处理和代码重用都很有帮助,所以下次会先说这两个知识点:我们会先对published_at这个字段的设置和使用发挥出来,到时候你就知道设置这个字段的好处了。

最后:Happy Hacking

本文由 JellyBool 创作, 转载和引用遵循 署名-非商业性使用 2.5 中国大陆 进行许可。

共有 42 条评论

openwrtmail
修改的评论也不能少于六个字哦!
JellyBool
修改的评论也不能少于六个字哦!
JellyBool
修改的评论也不能少于六个字哦!
lyon
修改的评论也不能少于六个字哦!
lyon
修改的评论也不能少于六个字哦!
JellyBool
修改的评论也不能少于六个字哦!
lyon
修改的评论也不能少于六个字哦!
JellyBool
修改的评论也不能少于六个字哦!
yanjiadong
修改的评论也不能少于六个字哦!
JellyBool
修改的评论也不能少于六个字哦!
zhengmin4516
修改的评论也不能少于六个字哦!
JellyBool
修改的评论也不能少于六个字哦!
zhengmin4516
修改的评论也不能少于六个字哦!
haoran
修改的评论也不能少于六个字哦!
JellyBool
修改的评论也不能少于六个字哦!
haoran
修改的评论也不能少于六个字哦!
JellyBool
修改的评论也不能少于六个字哦!
anqmkd1
修改的评论也不能少于六个字哦!
inlofter
修改的评论也不能少于六个字哦!
inlofter
修改的评论也不能少于六个字哦!
JellyBool
修改的评论也不能少于六个字哦!
dudushuang
修改的评论也不能少于六个字哦!
dudushuang
修改的评论也不能少于六个字哦!
dotasfans
修改的评论也不能少于六个字哦!
Jabbowocking
修改的评论也不能少于六个字哦!
Anonymous
修改的评论也不能少于六个字哦!
Anonymous
修改的评论也不能少于六个字哦!
Anonymous
修改的评论也不能少于六个字哦!
Anonymous
修改的评论也不能少于六个字哦!
Anonymous
修改的评论也不能少于六个字哦!
Anonymous
修改的评论也不能少于六个字哦!
Anonymous
修改的评论也不能少于六个字哦!
Anonymous
修改的评论也不能少于六个字哦!
Anonymous
修改的评论也不能少于六个字哦!
Anonymous
修改的评论也不能少于六个字哦!
Anonymous
修改的评论也不能少于六个字哦!
hlhsbczd123
修改的评论也不能少于六个字哦!
harryliuj
修改的评论也不能少于六个字哦!
JellyBool 回复 harryliuj
修改的评论也不能少于六个字哦!
harryliuj 回复 JellyBool
修改的评论也不能少于六个字哦!
Nixus
修改的评论也不能少于六个字哦!
bingo8
修改的评论也不能少于六个字哦!