Laravel5.1之表单验证

一.生成一个验证类

1.生成

artisan make:request TestRequest

  

2.生成的文件在项目Http下的Requests文件夹下

 

3.默认生成的文件如下

class TestRequest 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 [
            //
        ];
    }
}

  

二.添加自定义验证逻辑

*在代码中将说明

<?php

namespace Test\Http\Requests;

use Illuminate\Support\Facades\Response;


class TestRequest extends Request
{
    //验证规则,exists下面将会有说明
    protected $rules = [
        'mid' => ['required', 'integer', 'exists:articles, id, is_active, 1, is_end, 1'],
        'page' => ['required', 'integer'],
        'content' => ['required','min:5']
    ];

  //验证错误信息指定,否则默认是英文
    protected $messages = [
        'mid.required' => '参数错误',
        'mid.integer' => '参数错误',
        'mid.exists' => '数据不存在,或未审核通过!',
        'page.required' => '参数错误',
        'page.integer' => '参数错误',
        'content.required' => '内容必须填写',
        'content.min' => '内容不能少于:min个字',
    ];

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



    /**
     *验证权限失败时的相应
     */
    public function forbiddenResponse()
    {
        if ($this->ajax()) {
            return response()->json(['data' => null, 'info' => '没有权限', 'status' => 0]);
        } else {
            return abort(403);
        }
    }

    /**
     * 验证参数失败时的响应,如果验证指定的规则未通过,response将被调用,因为errors是个数组,保存所有的验证出错信息,这儿我们取出第一条显示,比较符合我们的使用习惯
     * @param array $errors
     * @return \Illuminate\Http\JsonResponse
     */
    public function response(array $errors)
    {
        if ($this->ajax()) {
            $firstErrors = array_shift($errors);
            $error = $firstErrors[0];
            return response()->json(['data' => null, 'info' => $error, 'status' => 0]);
        } else {
            return abort(404);
        }
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return $this->rules;
    }

    /**
     * @return array
     */
    public function messages()
    {
        return $this->messages;
    }
}

  

 

验证规则的exits说明

基本:

exists:table,column

这将从数据库查询,来确定是否通过

exists:articles,id,is_active,1,is_end,1

最终形成的SQL语句将是

select count(*) as aggregate from `articles` where ` id` = mid的值 and `is_active` = 1 and `is_end` = 1

如果查到数据,验证将通过,否则验证失败;需要注意的是exists中的各个值之间不要加空格,否则会形成如` is_active`这样子,导致数据库列不存在;

 

控制器中只要依赖注入这个验证类就可以了;这将在请求到来后,自动验证;

如果你不用验证类,也可以在控制器中写验证规则;

 

三.自定义验证规则

如果现有的验证规则不能满足我们的需求,我们可以自定义一个规则.

1.新建文件夹Validate,建立一个文件TestValidate.php

use Illuminate\Validation\Validator;

class TestValidator extends Validator
{
    /**
     * 注意该方法必须要以Validate开头,后面的是验证规则名称
     * 验证评论是否发表过快
     * @param $attribute
     * @param $value
     * @return bool
     */
    public function ValidateQuick($attribute, $value)
    {
        $userId = Auth::id();
        /**
         * 验证blog评论
         */
        if ($attribute === 'mid') {
            $mid = $value;
            $lastComment = app(PostRepository::class)->find($mid, $userId);

            if ($lastComment && $lastComment->time > time()-60*30) {
                return false;
            }
            return true;
        }
    }
}

  

2.在AppServiceProvider的boot方法中注册该验证规则

public function boot()
{
        /**
         * 验证评论是否发布过快
         */
        Validator::resolver(function($translator, $data, $rules, $messages) {
            return new TestValidator($translator, $data, $rules, $messages);
        });
}

  

3.使用

...........
'mid' => ['quick'],
..........

  

 

posted @ 2017-06-11 21:05  rorshach  阅读(980)  评论(0编辑  收藏  举报