php trait instanceof,Hyperf 验证 trait
模仿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相关推荐
- 【转】PHP之Trait详解 以及 trait 冲突的解决 insteadof
PHP之Trait学习!! (转)PHP之Trait详解 (转)trait 冲突的解决 insteadof
- 2021年大数据常用语言Scala(三十一):scala面向对象 特质(trait)
目录 特质(trait) 作为接口使用 定义具体的方法 定义具体方法和抽象方法 定义具体的字段和抽象的字段 实例对象混入trait trait调用链 trait的构造机制 trait继承class 特 ...
- Scala学习教程笔记二之函数式编程、Object对象、伴生对象、继承、Trait、
1:Scala之函数式编程学习笔记: 1:Scala函数式编程学习:1.1:Scala定义一个简单的类,包含field以及方法,创建类的对象,并且调用其方法:class User {private v ...
- php动态+trait,详解PHP神奇又有用的Trait
php和java,c++一样都是单继承模式.但是像python,是支持多继承(即Mixin模式).那么如何在php中实现多继承模式?这就需要使用trait. trait Arrayabletrait{ ...
- Scala特质trait
Scala特质 章节目标 能够使用trait独立完成适配器, 模板方法, 职责链设计模式 能够独立叙述trait的构造机制 能够了解trait继承class的写法 能够独立完成程序员案例 1. 特质入 ...
- 大数据必学语言Scala(三十一):scala面向对象 特质(trait)
文章目录 特质(trait) 作为接口使用 定义具体的方法 定义具体方法和抽象方法 定义具体的字段和抽象的字段 实例对象混入trait trait调用链 trait的构造机制 trait继承class ...
- Scala 034 特质trait
文章目录 Scala 特质trait trait作为接口使用 trait中还可以定义具体的方法 trait中定义具体的字段和抽象的字段 使用trait实现模板模式 对象混入trait trait实现调 ...
- Scala----特质trait的使用
1. 特质入门 1.1 概述 有些时候, 我们会遇到一些特定的需求, 即: 在不影响当前继承体系的情况下, 对某些类(或者某些对象)的功能进行加强, 例如: 有猴子类和大象类, 它们都有姓名, 年龄, ...
- Scala 中的 特质(trait)
文章目录 特质(trait) 概念 语法 继承特质 继承单个trait 代码示例 继承多个特质 代码示例 定义具体的方法 代码示例 trait中定义具体的字段和抽象的字段 定义 代码示例 模板模式 代 ...
最新文章
- Nodejs学习笔记(五)--- Express安装入门与模版引擎ejs
- 迷宫问题pascal程序
- 2013长春区域赛总结
- C#趣味程序----分数之和
- 力改变物体形状举例_对旋转问题的思考-在离心力确定的情况下,物体的旋转情况如何通过宇宙中的相对运动情况和质量分布确定?...
- Memcached在Windows下的安装
- docker学习(1) 安装
- 1030: [JSOI2007]文本生成器
- 如何免费下载知网论文
- ckeditor5 用法
- 夜深人静, 看看编程人生
- # 个人日记-书籍《银河帝国2之基地与帝国》观后感-20210808
- 青龙面板--Nvjdc的搭建
- Object.freeze()
- APP 的开发费用标准是什么?
- SpringBoot application.properties读取属性配置文件中文显示为乱码问题的解决
- SQL SERVER中LEAD和LAG函数
- 高中数学40分怎么办_新高一第一次考试数学只考了40分,还有救吗?
- regexp_replace
- Zotero+Zotfile+TeraCloud 两台电脑实时同步问题
热门文章
- 抖音、今日头条、西瓜视频将打包上市
- 群辉通过Docker搭建Redis集群
- Maven 项目使用开源中国镜像
- 自动投票器的原理及设计思路 http://blog.csdn.net/lkfstar/archive/2008/01/12/2039070.aspx
- 绕不开的一元二次方程
- Json解析(Json集合,Json嵌套)
- MCP2515/SIT2515 驱动_SIT2515 功能与MCP2515完全
- 狗日的腾讯与骡子日的360
- bootstrap-table 添加行保留原数据
- python中@property以及描述符descriptor详解