Home
Download
Document
Forum
Video
Donate
Source Code
AI 助理
Sponsors
CRMEB
Apipost
腾讯云
微擎
禅道
51Talk
Products
Swoole AI 智能文档翻译器
Swoole-Compiler PHP 代码加密器
CRMEB 新零售社交电商系统
Login
Register
全部
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
发表新帖
Hyperf Trait 中使用注解问题
### 问题描述 在使用 `JsonRpc` 服务时,我写了一个服务提供者,这时候我想应该用验证类来验证服务消费者传来的数据是否合法 我写了一个 `ValidationTrait` ```php <?php namespace App\Traits; use App\Constants\ErrorCode; use App\Exception\ApiException; use Hyperf\Di\Annotation\Inject; use Hyperf\Validation\ValidatorFactory; trait ValidationTrait { /** * @Inject() * @var ValidatorFactory */ protected $validatorFactory; /** * 验证参数合法性 * @param array $params * @param array $rules * @param array $field * @param array $message * @return array|mixed */ function checkValidate($params = [], $rules = [], $message = [], $field = []) { $validate = $this->validatorFactory->make($params, $rules, $message, $field); if ($validate->fails()) { throw new ApiException(ErrorCode::BAD_REQUEST, $validate->errors()->first()); } return $validate->validated(); } } ``` 在服务提供者中我这样使用 ```php /** * @RpcService(name="TestService", protocol="jsonrpc-http", server="jsonrpc-http", publishTo="consul") */ class TestService extends BaseService implements LotteryTemplateInterface { use ValidationTrait; public function createTest(array $requestData) { $request = $this->checkValidate($requestData, StoreRequest::rules()); } } ``` 这个时候会报错为: ![](/storage/article-column/3dGMSBn5ynsZY2XxaM33WKIOzQ0sLUSyzymMECKe.jpeg) 但我发现如果在 `TestService` 中使用 `Inject` 注入了其他 `Interface`,那么则不会报错,即可以使用 `ValidationTrait`,具体代码如下 ```php use ValidationTrait; /** * @Inject() * @var PassportInterface */ protected $passportInterface; ``` 这时我发现当使用 `Inject` 注入了 `PassportInterface` 时,`Hyperf` 会生成代理类在 `runtime/container/proxy` 目录中,否则不会生成代理类。 我想问一下这是什么原理、如何合理的使用我这个 `ValidationTrait`,或者有什么其他方式合理的使用我封装的这个 `Validation` ### Swoole版本,PHP版本,以及操作系统版本信息 Swoole版本:4.6.7 PHP版本:7.4
发布于3年前 · 63 次浏览 · 来自
开发框架
洋1024
### 问题描述 在使用 `JsonRpc` 服务时,我写了一个服务提供者,这时候我想应该用验证类来验证服务消费者传来的数据是否合法 我写了一个 `ValidationTrait` ```php <?php namespace App\Traits; use App\Constants\ErrorCode; use App\Exception\ApiException; use Hyperf\Di\Annotation\Inject; use Hyperf\Validation\ValidatorFactory; trait ValidationTrait { /** * @Inject() * @var ValidatorFactory */ protected $validatorFactory; /** * 验证参数合法性 * @param array $params * @param array $rules * @param array $field * @param array $message * @return array|mixed */ function checkValidate($params = [], $rules = [], $message = [], $field = []) { $validate = $this->validatorFactory->make($params, $rules, $message, $field); if ($validate->fails()) { throw new ApiException(ErrorCode::BAD_REQUEST, $validate->errors()->first()); } return $validate->validated(); } } ``` 在服务提供者中我这样使用 ```php /** * @RpcService(name="TestService", protocol="jsonrpc-http", server="jsonrpc-http", publishTo="consul") */ class TestService extends BaseService implements LotteryTemplateInterface { use ValidationTrait; public function createTest(array $requestData) { $request = $this->checkValidate($requestData, StoreRequest::rules()); } } ``` 这个时候会报错为: ![](/storage/article-column/3dGMSBn5ynsZY2XxaM33WKIOzQ0sLUSyzymMECKe.jpeg) 但我发现如果在 `TestService` 中使用 `Inject` 注入了其他 `Interface`,那么则不会报错,即可以使用 `ValidationTrait`,具体代码如下 ```php use ValidationTrait; /** * @Inject() * @var PassportInterface */ protected $passportInterface; ``` 这时我发现当使用 `Inject` 注入了 `PassportInterface` 时,`Hyperf` 会生成代理类在 `runtime/container/proxy` 目录中,否则不会生成代理类。 我想问一下这是什么原理、如何合理的使用我这个 `ValidationTrait`,或者有什么其他方式合理的使用我封装的这个 `Validation` ### Swoole版本,PHP版本,以及操作系统版本信息 Swoole版本:4.6.7 PHP版本:7.4
赞
0
分享
收藏
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
评论
2021-06-25
洋1024
![](/storage/article-column/6TarhipFPSLzQDldYHgScMdzskBpYIRVLRQvKxej.png) ![](/storage/article-column/Zf3L7Zm0qwhC2e6hVB6nbG7LyL9uT6MuZlpvv91v.png) 我把原本注入在 Trait 中的 validatorFactory 写到了外面,就行了 原因应该 Trait 可以共用上一级文件的属性(即 use 该 Trait 的地方),当我在 Rpc 服务中 Inject 了其他服务,那么 Hyperf Di 会生成代理类,这时候 Trait 也属于是 Hyperf Di 生成的 反之,若没有生成代理类,则在 Trait 中无法使用 Inject 注入,所以,将 Trait 中注入的内容放到 Rpc 服务中,Trait 中也可以使用 ValidationFactory 最终解决办法: https://hyperf.wiki/2.1/#/zh-cn/quick-start/questions?id=inject-%E6%88%96-value-%E6%B3%A8%E8%A7%A3%E4%B8%8D%E7%94%9F%E6%95%88
赞
0
回复
微信公众号
热门内容
作者其它话题
- Hyperf 框架发送 Email 邮件控制台报错 check_worker_exit_status()
暂无回复的问答
- CodeGalaxy K3s 轻量集群节点之间如何实现负载均衡
- 关于openssl CURL WARNING swSSL_connect: SSL_connect(fd=69) failed. Error: error:141A318A:SSL routines:tls_process_ske_dhe:dh key too small[1|394]
- 多个模型如何进行事务异常回退?
- websocket开启wss报错
- 协程tcp服务器如何使用多进程?recv()方法接收信息,打印出来的pid一直是同一个。没用使用到多进程啊。