当前位置: 首页 > news >正文

hyperf笔记

先粘贴一个,稍后再写

事件机制
前言
事件模式必须基于 PSR-14 去实现。
Hyperf 的事件管理器默认由 hyperf/event 实现,该组件亦可用于其它框架或应用,只需通过 Composer 将该组件引入即可。

composer require hyperf/event
Copy to clipboardErrorCopied
概念
事件模式是一种经过了充分测试的可靠机制,是一种非常适用于解耦的机制,分别存在以下 3 种角色:

事件(Event) 是传递于应用代码与 监听器(Listener) 之间的通讯对象
监听器(Listener) 是用于监听 事件(Event) 的发生的监听对象
事件调度器(EventDispatcher) 是用于触发 事件(Event) 和管理 监听器(Listener) 与 事件(Event) 之间的关系的管理者对象
用通俗易懂的例子来说明就是,假设我们存在一个 UserService::register() 方法用于注册一个账号,在账号注册成功后我们可以通过事件调度器触发 UserRegistered 事件,由监听器监听该事件的发生,在触发时进行某些操作,比如发送用户注册成功短信,在业务发展的同时我们可能会希望在用户注册成功之后做更多的事情,比如发送用户注册成功的邮件等待,此时我们就可以通过再增加一个监听器监听 UserRegistered 事件即可,无需在 UserService::register() 方法内部增加与之无关的代码。

使用事件管理器
接下来我们会通过配置和注解两种方式介绍监听器,实际使用时,二者只需使用其一即可,如果既有注解又有配置,则会造成监听器被多次触发。

定义一个事件
一个事件其实就是一个用于管理状态数据的普通类,触发时将应用数据传递到事件里,然后监听器对事件类进行操作,一个事件可被多个监听器监听。

<?php namespace App\Event; class UserRegistered { // 建议这里定义成 public 属性,以便监听器对该属性的直接使用,或者你提供该属性的 Getter public $user; public function __construct($user) { $this->user = $user; } } Copy to clipboardErrorCopied 定义一个监听器 监听器都需要实现一下 Hyperf\Event\Contract\ListenerInterface 接口的约束方法,示例如下。 <?php namespace App\Listener; use App\Event\UserRegistered; use Hyperf\Event\Contract\ListenerInterface; class UserRegisteredListener implements ListenerInterface { public function listen(): array { // 返回一个该监听器要监听的事件数组,可以同时监听多个事件 return [ UserRegistered::class, ]; } /** * @param UserRegistered $event */ public function process(object $event) { // 事件触发后该监听器要执行的代码写在这里,比如该示例下的发送用户注册成功短信等 // 直接访问 $event 的 user 属性获得事件触发时传递的参数值 // $event->user; } } Copy to clipboardErrorCopied 通过配置文件注册监听器 在定义完监听器之后,我们需要让其能被 事件调度器(Dispatcher) 发现,可以在 config/autoload/listeners.php 配置文件 (如不存在可自行创建) 内添加该监听器即可,监听器的触发顺序根据该配置文件的配置顺序: <?php return [ \App\Listener\UserRegisteredListener::class, ]; Copy to clipboardErrorCopied 通过注解注册监听器 Hyperf 还提供了一种更加简便的监听器注册方式,就是通过 @Listener 注解注册,只要将该注解定义在监听器类上,且监听器类处于 Hyperf 注解扫描域 内即可自动完成注册,代码示例如下: <?php namespace App\Listener; use App\Event\UserRegistered; use Hyperf\Event\Annotation\Listener; use Hyperf\Event\Contract\ListenerInterface; /** * @Listener */ class UserRegisteredListener implements ListenerInterface { public function listen(): array { // 返回一个该监听器要监听的事件数组,可以同时监听多个事件 return [ UserRegistered::class, ]; } /** * @param UserRegistered $event */ public function process(object $event) { // 事件触发后该监听器要执行的代码写在这里,比如该示例下的发送用户注册成功短信等 // 直接访问 $event 的 user 属性获得事件触发时传递的参数值 // $event->user; } } Copy to clipboardErrorCopied 在通过注解注册监听器时,我们可以通过设置 priority 属性定义当前监听器的顺序,如 @Listener(priority=1) ,底层使用 SplPriorityQueue 结构储存,priority 数字越大优先级越高。 使用 @Listener 注解时需 use Hyperf\Event\Annotation\Listener; 命名空间; 触发事件 事件需要通过 事件调度器(EventDispatcher) 调度才能让 监听器(Listener) 监听到,我们通过一段代码来演示如何触发事件: <?php namespace App\Service; use Hyperf\Di\Annotation\Inject; use Psr\EventDispatcher\EventDispatcherInterface; use App\Event\UserRegistered; class UserService { /** * @Inject * @var EventDispatcherInterface */ private $eventDispatcher; public function register() { // 我们假设存在 User 这个实体 $user = new User(); $result = $user->save(); // 完成账号注册的逻辑 // 这里 dispatch(object $event) 会逐个运行监听该事件的监听器 $this->eventDispatcher->dispatch(new UserRegistered($user)); return $result; } }

相关文章:

  • 使用Postman并发测试接口关于RedisTemplate线程安全的一些理解
  • Java八锁现象
  • 谷氨酸三方突触丨SYSY谷氨酸GluA解决方案
  • 做一个校园跑腿小程序需要多少成本?
  • js实现pdf、word、excel、图片、html文件预览及下载
  • 孙卫琴的《精通Vue.js》读书笔记-注册全局组件和局部组件
  • 28、iNeRF
  • 相关性 与 独立性
  • set和map的模拟
  • window环境下安装大数据环境
  • 解决navicat premium连接数据库自动断开问题
  • 学历提升中的我,入职产品经理之路
  • 网络安全专家,这5本入门秘籍人手一套
  • 智源AI日报(2022-08-30): 华为谢凌曦:关于视觉识别领域发展的个人观点
  • 示波器十大基础知识你都了解多少
  • 【css3】浏览器内核及其兼容性
  • 08.Android之View事件问题
  • co.js - 让异步代码同步化
  • ES学习笔记(12)--Symbol
  • idea + plantuml 画流程图
  • Java 多线程编程之:notify 和 wait 用法
  • Java深入 - 深入理解Java集合
  • JDK 6和JDK 7中的substring()方法
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • React as a UI Runtime(五、列表)
  • redis学习笔记(三):列表、集合、有序集合
  • TypeScript实现数据结构(一)栈,队列,链表
  • vue数据传递--我有特殊的实现技巧
  • 阿里云前端周刊 - 第 26 期
  • 爱情 北京女病人
  • 从PHP迁移至Golang - 基础篇
  • 给第三方使用接口的 URL 签名实现
  • 简单易用的leetcode开发测试工具(npm)
  • 前端js -- this指向总结。
  • 前端路由实现-history
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 如何设计一个比特币钱包服务
  • 探索 JS 中的模块化
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • 湖北分布式智能数据采集方法有哪些?
  • #QT(一种朴素的计算器实现方法)
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (LeetCode 49)Anagrams
  • (poj1.3.2)1791(构造法模拟)
  • (二)c52学习之旅-简单了解单片机
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (转)jQuery 基础
  • (转)LINQ之路
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?