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