模仿Laravel的ValidatesRequest写的一个Trait,仅供参考。

trait类:

namespace App\Controller;

use Hyperf\HttpServer\Contract\RequestInterface;

use Hyperf\Validation\Contract\ValidatorFactoryInterface;

use Hyperf\Contract\ValidatorInterface;

use Hyperf\Validation\ValidationException;

trait ValidatesRequests

{

/**

* @param ValidatorInterface|array $validator

* @param RequestInterface|null $request

* @return array

*

* @throws ValidationException

*/

public function validateWith($validator, RequestInterface $request = null)

{

$request = $request ?? request();

if (is_array($validator)) {

$validator = $this->getValidationFactory()->make($request->all(), $validator);

}

return $validator->validate();

}

/**

* @param RequestInterface $request

* @param array $rules

* @param array $messages

* @param array $customAttributes

* @return mixed

*

* @throws ValidationException

*/

public function validate(RequestInterface $request, array $rules,

array $messages = [], array $customAttributes = [])

{

return $this->getValidationFactory()->make(

$request->all(), $rules, $messages, $customAttributes

)->validate();

}

/**

* @param $errorBag

* @param RequestInterface $request

* @param array $rules

* @param array $messages

* @param array $customAttributes

* @return mixed

*

* @throws ValidationException

*/

public function validateWithBag($errorBag, RequestInterface $request, array $rules,

array $messages = [], array $customAttributes = [])

{

try {

return $this->validate($request, $rules, $messages, $customAttributes);

} catch (ValidationException $e) {

$e->errorBag = $errorBag;

throw $e;

}

}

/**

* @return ValidatorFactoryInterface

*/

protected function getValidationFactory()

{

return make(ValidatorFactoryInterface::class);

}

}

用法:

在 AbstractController 中

use ValidatesRequests;

然后就可以在继承AbstractController所有的控制器中这样使用了:

public function index(RequestInterface $request)

{

$this->validate($request, [

'id' => 'required|integer'

], [], [

'id' => 'ID',

]);

}

异常类

定义一个异常类来catch到验证异常

namespace App\Exception;

use Hyperf\HttpMessage\Stream\SwooleStream;

use Hyperf\Validation\ValidationExceptionHandler;

use Psr\Http\Message\ResponseInterface;

use Throwable;

class ValidationException extends ValidationExceptionHandler

{

public function handle(Throwable $throwable, ResponseInterface $response)

{

$this->stopPropagation();

/** @var \Hyperf\Validation\ValidationException $throwable */

$body = json_encode([

'errors' => $throwable->validator->errors()->first()

], JSON_UNESCAPED_UNICODE);

return $response->withHeader('Content-Type', 'application/json')->withStatus($throwable->status)->withBody(new SwooleStream($body));

}

public function isValid(Throwable $throwable): bool

{

return $throwable instanceof \Hyperf\Validation\ValidationException;

}

}

然后在config/autoload/exceptions.php中添加

return [

'handler' => [

'http' => [

App\Exception\Handler\SystemExceptionHandler::class,

App\Exception\ValidationException::class, //该处就是验证异常类 必须放在AppExceptionHandler上

App\Exception\Handler\AppExceptionHandler::class,

],

],

];

本作品采用《CC 协议》,转载必须注明作者和本文链接

php trait instanceof,Hyperf 验证 trait相关推荐

  1. 【转】PHP之Trait详解 以及 trait 冲突的解决 insteadof

    PHP之Trait学习!! (转)PHP之Trait详解 (转)trait 冲突的解决 insteadof

  2. 2021年大数据常用语言Scala(三十一):scala面向对象 特质(trait)

    目录 特质(trait) 作为接口使用 定义具体的方法 定义具体方法和抽象方法 定义具体的字段和抽象的字段 实例对象混入trait trait调用链 trait的构造机制 trait继承class 特 ...

  3. Scala学习教程笔记二之函数式编程、Object对象、伴生对象、继承、Trait、

    1:Scala之函数式编程学习笔记: 1:Scala函数式编程学习:1.1:Scala定义一个简单的类,包含field以及方法,创建类的对象,并且调用其方法:class User {private v ...

  4. php动态+trait,详解PHP神奇又有用的Trait

    php和java,c++一样都是单继承模式.但是像python,是支持多继承(即Mixin模式).那么如何在php中实现多继承模式?这就需要使用trait. trait Arrayabletrait{ ...

  5. Scala特质trait

    Scala特质 章节目标 能够使用trait独立完成适配器, 模板方法, 职责链设计模式 能够独立叙述trait的构造机制 能够了解trait继承class的写法 能够独立完成程序员案例 1. 特质入 ...

  6. 大数据必学语言Scala(三十一):scala面向对象 特质(trait)

    文章目录 特质(trait) 作为接口使用 定义具体的方法 定义具体方法和抽象方法 定义具体的字段和抽象的字段 实例对象混入trait trait调用链 trait的构造机制 trait继承class ...

  7. Scala 034 特质trait

    文章目录 Scala 特质trait trait作为接口使用 trait中还可以定义具体的方法 trait中定义具体的字段和抽象的字段 使用trait实现模板模式 对象混入trait trait实现调 ...

  8. Scala----特质trait的使用

    1. 特质入门 1.1 概述 有些时候, 我们会遇到一些特定的需求, 即: 在不影响当前继承体系的情况下, 对某些类(或者某些对象)的功能进行加强, 例如: 有猴子类和大象类, 它们都有姓名, 年龄, ...

  9. Scala 中的 特质(trait)

    文章目录 特质(trait) 概念 语法 继承特质 继承单个trait 代码示例 继承多个特质 代码示例 定义具体的方法 代码示例 trait中定义具体的字段和抽象的字段 定义 代码示例 模板模式 代 ...

最新文章

  1. Nodejs学习笔记(五)--- Express安装入门与模版引擎ejs
  2. 迷宫问题pascal程序
  3. 2013长春区域赛总结
  4. C#趣味程序----分数之和
  5. 力改变物体形状举例_对旋转问题的思考-在离心力确定的情况下,物体的旋转情况如何通过宇宙中的相对运动情况和质量分布确定?...
  6. Memcached在Windows下的安装
  7. docker学习(1) 安装
  8. 1030: [JSOI2007]文本生成器
  9. 如何免费下载知网论文
  10. ckeditor5 用法
  11. 夜深人静, 看看编程人生
  12. # 个人日记-书籍《银河帝国2之基地与帝国》观后感-20210808
  13. 青龙面板--Nvjdc的搭建
  14. Object.freeze()
  15. APP 的开发费用标准是什么?
  16. SpringBoot application.properties读取属性配置文件中文显示为乱码问题的解决
  17. SQL SERVER中LEAD和LAG函数
  18. 高中数学40分怎么办_新高一第一次考试数学只考了40分,还有救吗?
  19. regexp_replace
  20. Zotero+Zotfile+TeraCloud 两台电脑实时同步问题

热门文章

  1. 抖音、今日头条、西瓜视频将打包上市
  2. 群辉通过Docker搭建Redis集群
  3. Maven 项目使用开源中国镜像
  4. 自动投票器的原理及设计思路 http://blog.csdn.net/lkfstar/archive/2008/01/12/2039070.aspx
  5. 绕不开的一元二次方程
  6. Json解析(Json集合,Json嵌套)
  7. MCP2515/SIT2515 驱动_SIT2515 功能与MCP2515完全
  8. 狗日的腾讯与骡子日的360
  9. bootstrap-table 添加行保留原数据
  10. python中@property以及描述符descriptor详解