版权声明:本文为博主原创文章,未经博主允许不得转载。

今天开始跳lumen的表单验证Validate类的坑,确实好坑!!!

首先,lumen的表单验证返回是无状态的json格式api,这...

所有开始搞起,

先来看看官方的方法,验证不通过直接返回json。

  1. $this->validate($request, $rules, $message, $attributes);
  1. namespace Laravel\Lumen\Routing;
  2.  
  3. trait ProvidesConvenienceMethods{
  4.  
  5. ......
  6.  
  7. public function validate(Request $request, array $rules, array $messages = [], array $customAttributes = [])
  8. {
  9. $validator = $this->getValidationFactory()->make($request->all(), $rules, $messages, $customAttributes);
  10.  
  11. if ($validator->fails()) {
  12. $this->throwValidationException($request, $validator);
  13. }
  14. }
  15.  
  16. ......
  17.  
  18. }

 

$this->throwValidationException($request, $validator);原来是这里直接返回json

  1. if ($validator->fails()) {
  2. /**
  3. * 修改验证返回
  4. */
  5. return $this->formatValidationErrors($validator);
  6. $this->throwValidationException($request, $validator);
  7. }

重新发送请求,果然生效了!!!可是...   看了一下路径vendor\laravel\lumen-framework\src\Routing\ProvidesConvenienceMethods.php,尴尬了,是扩展包的类。。。

控制器的底层类Controller.php也在这里,点进去look一look,

  1. <?php
  2.  
  3. namespace Laravel\Lumen\Routing;
  4.  
  5. class Controller
  6. {
  7. use ProvidesConvenienceMethods;
  8.  
  9. /**
  10. * The middleware defined on the controller.
  11. *
  12. * @var array
  13. */
  14. protected $middleware = [];
  15.  
  16. /**
  17. * Define a middleware on the controller.
  18. *
  19. * @param string $middleware
  20. * @param array $options
  21. * @return void

果然在这里引用ProvidesConvenienceMethods,而前面控制器的$this->validate应该也是调的这里,一切明了,在这里加一个和validate类似的方法不就OK了?

  1. public function validates(Request $request, array $rules, array $messages = [], array $customAttributes = [])
  2. {
  3. $validator = $this->getValidationFactory()->make($request->all(), $rules, $messages, $customAttributes);
  4.  
  5. if ($validator->fails()) {
           echo 1;exit();
  6. /**
  7. * 修改验证返回
  8. */
  9. return $this->formatValidationErrors($validator);
  10. //$this->throwValidationException($request, $validator);
  11. }
  12. }

调用$this->validates($request, $rules, $message, $attributes);//输出1

注释断点再测试,发现验证通过,返回结果集!

不过写在这里肯定不好,那就写在比较靠近应用层的Controller.php吧——app\Http\Controller/Controller.php

  1. <?php
  2.  
  3. namespace App\Http\Controllers;
  4.  
  5. use Laravel\Lumen\Routing\Controller as BaseController;
  6. use App\Providers\Validate\AppProvidersValidate;
  7.  
  8. class Controller extends BaseController
  9. {
  10. //全局表单验证定制类
  11. use AppProvidersValidate;
  12. //
  13. }
  1. AppProvidersValidate.php放在哪,在什么命名空间下,你开心就好咯!我放在app\Providers\Validate\AppProvidersValidate.php具体代码如下,
  1. <?php
  2. namespace App\Providers\Validate;
  3.  
  4. use Illuminate\Http\Request;
  5.  
  6. trait AppProvidersValidate
  7. {
  8. public function validates(Request $request, array $rules, array $messages = [], array $customAttributes = [])
  9. {
  10. $validator = $this->getValidationFactory()->make($request->all(), $rules, $messages, $customAttributes);
  11.  
  12. if ($validator->fails()) {
  13. /**
  14. * 修改验证返回
  15. */
  16. return $this->formatValidationErrors($validator);
  17. //$this->throwValidationException($request, $validator);
  18. }
  19. }
  20. }

以后一些针对表单验证的处理操作也可以放在这里啦!!!网上资料好少,纯手打,请不要转载,谢谢啦!!!详细分析(添加手机验证,中文验证与Validator验证的“半个”生命周期):http://www.cnblogs.com/cxscode/p/7561277.html

补充一下:

vendor\illuminate\validation\Factory.php是make()函数的实现位置,喜欢可以研究探讨下

  1. namespace Illuminate\Validation;
  2. class Factory implements FactoryContract
  3.  
  4. {
  5.  
  6.   ......
  7.  
  8. public function make(array $data, array $rules, array $messages = [], array $customAttributes = [])
  9. {
  10. // The presence verifier is responsible for checking the unique and exists data
  11. // for the validator. It is behind an interface so that multiple versions of
  12. // it may be written besides database. We'll inject it into the validator.
  13. $validator = $this->resolve(
  14. $data, $rules, $messages, $customAttributes
  15. );
  16.  
  17. if (! is_null($this->verifier)) {
  18. $validator->setPresenceVerifier($this->verifier);
  19. }
  20.  
  21. // Next we'll set the IoC container instance of the validator, which is used to
  22. // resolve out class based validator extensions. If it is not set then these
  23. // types of extensions will not be possible on these validation instances.
  24. if (! is_null($this->container)) {
  25. $validator->setContainer($this->container);
  26. }
  27.  
  28. $this->addExtensions($validator);
  29.  
  30. return $validator;
  31. }
  32.  
  33. ......
  34.  
  35. }

补充,如果找不到想要的验证:

https://www.cnblogs.com/tfcwolf/p/4350283.html

本文地址:http://www.cnblogs.com/cxscode/p/7485379.html

版权声明:本文为博主原创文章,未经博主允许不得转载。

lumen手记:自定义Validate表单验证的更多相关文章

  1. ASP.NET MVC Jquery Validate 表单验证的多种方式

    在我们日常开发过程中,前端的表单验证很重要,如果这块处理不当,会出现很多bug .但是如果处理的好,不仅bug会很少,用户体验也会得到很大的提升.在开发过程中我们可以不借助 JS 库,自己去手写 JS ...

  2. 【干货】Laravel --Validate (表单验证) 使用实例

    前言 : Laravel 提供了多种方法来验证应用输入数据.默认情况下,Laravel 的控制器基类使用ValidatesRequests trait,该trait提供了便利的方法通过各种功能强大的验 ...

  3. [转]ASP.NET MVC Jquery Validate 表单验证的多种方式介绍

    在我们日常开发过程中,前端的表单验证很重要,如果这块处理不当,会出现很多bug .但是如果处理的好,不仅bug会很少,用户体验也会得到很大的提升.在开发过程中我们可以不借助 JS 库,自己去手写 JS ...

  4. Jquery Validate 表单验证的多种方式

    ASP.NET MVC Jquery Validate 表单验证的多种方式 在我们日常开发过程中,前端的表单验证很重要,如果这块处理不当,会出现很多bug .但是如果处理的好,不仅bug会很少,用户体 ...

  5. jQuery-easyui和validate表单验证实例

    jQuery EasyUI 表单 - 表单验证插件validatebox 使用时需要向页面引入两个css文件如下: <link rel="stylesheet" href=& ...

  6. 看用Tornado如何自定义实现表单验证

    我们知道,平时在登陆某个网站或软件时,网站对于你输入的内容是有要求的,并且会对你输入的错误内容有提示,对于Django这种大而全的web框架,是提供了form表单验证功能,但是对于Tornado而言, ...

  7. 基于jQuery的Validate表单验证

    表单验证可以说在前端开发工作中是无处不在的~ 有数据,有登录,有表单, 都需要前端验证~~  而我工作中用到最多的就是基于基于jQuery的Validate表单验证~  就向下面这样~ 因为今天有个朋 ...

  8. summernote富文本编辑器配合validate表单验证无法进行表单提交的问题

    1.使用summernote富文本编辑器提交图片到服务器 在使用bootstrap中,我们用到了summernote富文本编辑器,使用summernote将图片上传到服务器中,参考我的上篇文章http ...

  9. thinkphp图片上传+validate表单验证+图片木马检测+缩略图生成

    目录 1.案例 1.1图片上传  1.2进行图片木马检测   1.3缩略图生成   1.4控制器中调用缩略图生成方法 1.案例 前言:在thinkphp框架的Thinkphp/Library/Thin ...

随机推荐

  1. java拦截器与过滤器打印请求url与参数

    HttpServletRequest httpServletRequest = (HttpServletRequest) request; HttpServletResponse httpServle ...

  2. Gradle Distributions

    Gradle Distributions services.gradle.org/ distributions/ gradle-3.4-rc-3-all.zip 13-Feb-2017 14:55 + ...

  3. vim常用操作之复制剪切粘贴,注释取消注释,多行缩进等

    进入vim按下v键,选择要操作的对象 按下y复制,d剪切,p粘贴 >缩进,<取消缩进 按下esc退出操作 按下ctrl+v,选择要操作对象, 按下大写I,写入注释符号,按下d取消注释 按下 ...

  4. JRebel 7.0.10 for intellij IDEA 2017.1

    1什么是JRebel? JRebel是一套JavaEE开发工具.JRebel是一款JAVA虚拟机插件,它使得JAVA程序员能在不进行重部署的情况下,即时看到代码的改变对一个应用程序带来的影响.JReb ...

  5. 2017.8.23 postgresql的外键

    1.增加/删除外键的语法 ALTER TABLE t_permission ADD CONSTRAINT fkey FOREIGN KEY (fd_resid) REFERENCES t_resour ...

  6. 2017.6.29 java读取.properties配置文件的几种方法

    参考来自:http://www.cnblogs.com/s3189454231s/p/5626557.html 关于路径的解释:http://blog.csdn.net/bluishglc/artic ...

  7. python raise assert

    class MyException(Exception): def __init__(self,error_msg): self.error_msg=error_msg def __str__(sel ...

  8. 【DB2】新建用户

    1.创建用户(切换到root用户下操作) useradd -g users -d /home/qinys -s /bin/bash -m qinys 2.修改密码 passwd qinys 备注:此处 ...

  9. linux在shell中获取时间 date巧用

    获得当天的日期 date +%Y-%m-%d 输出: 2011-07-28 date1=$(date --date='1 days ago +%Y%m%d')    #前一天的日期 date1=$(d ...

  10. Linux的文件传输命令总结

    由于工作原因,须要常常在不同的server见进行文件传输,特别是大文件的传输,因此对linux下不同server间传输数据命令和工具进行了研究和总结.主要是rcp,scp,rsync,ftp,sftp ...