ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

zend-eventmanager 通配符监听器:一个星号 ‘*‘ 优雅搞定所有事件监听

zend-eventmanager 通配符监听器:一个星号 ‘*‘ 优雅搞定所有事件监听 【免费下载链接】zend-eventmanagerImplement event systems, signal slots, intercepting filters, and observers.项目地址https://gitcode.com/gh_mirrors/ze/zend-eventmanager点击查看免费下载还在逐个事件手动 attach 监听器吗PHP 事件管理组件zend-eventmanager的通配符监听器Wildcard Listeners允许你用一个星号*让单个监听器捕获所有事件——后续新增事件也无需改动代码。本文用简单示例带你掌握EventManager与SharedEventManager下的通配符用法、执行顺序与移除方法一看就会。 为什么需要通配符监听器在典型的信号槽signal slots场景里一个对象会触发多种命名事件比如save、delete、update。如果你的逻辑需要对每个事件都做出反应例如统一记录日志、统一计时逐名注册会写出大量重复代码$events-attach(save, $logger); $events-attach(delete, $logger); $events-attach(update, $logger); // ...事件再多一个就要再多写一行而通配符监听器只需一行任何事件触发时它都会收到通知这正是 doc/book/wildcard-listeners.md 中所描述的attach to all events能力。✅ 三步上手给 EventManager 挂上通配符监听器只需在attach()的第一个参数传*即可监听当前EventManager实例上的所有事件use Zend\EventManager\EventManager; $events new EventManager(); $events-attach(*, function ($e) { // 任何事件触发时这里都会收到通知 var_dump($e-getName()); }); $events-trigger(save); // 输出 save $events-trigger(delete); // 输出 delete实现原理并不神秘触发事件时EventManager会把注册在*下的监听器合并进当前事件的监听队列中相关逻辑见 src/EventManager.php。 提示通配符监听器同样支持第三个参数$priority且该优先级对所有被触发的事件生效。 SharedEventManager 通配符的三种组合SharedEventManager的attach()接收两个字符串参数标识符identifier代表哪个上下文/组件和事件名。两个参数都可以使用通配符组合出四种覆盖范围写法含义attach(foo, *, $listener)监听 foo 上下文下的所有事件attach(*, foo, $listener)监听任意上下文的 foo 事件attach(*, *, $listener)监听所有上下文的所有事件$sharedEvents new SharedEventManager(); // foo 上下文的所有事件 $sharedEvents-attach(foo, *, $listener); // 任意上下文的 foo 事件 $sharedEvents-attach(*, foo, $listener); // 所有上下文的所有事件 $sharedEvents-attach(*, *, $listener);触发事件时SharedEventManager::getListeners()会把命中各层通配符的监听器与精确匹配的一起返回合并逻辑可参考 src/SharedEventManager.php。⏱️ 执行顺序优先级才是关键两个容易忽略的行为细节优先级统一生效attach 时指定的$priority会应用于该通配符监听器匹配的每一个事件。同优先级下精确监听器先执行通配符监听器后执行。这样能保证专项处理先于通用处理例如$events-attach(*, function ($e) { echo wildcard\n; }, 5); $events-attach(test, function ($e) { echo explicit\n; }, 5); $events-trigger(test); // 输出explicit 在前wildcard 在后该行为有专门的测试用例保障见 test/EventManagerPriorityTest.php。 如何优雅地移除通配符监听器detach()第二个参数传*或直接省略即可把监听器从所有事件上摘除$events-detach($listener, *); // 等价于 $events-detach($listener)内部会遍历所有已注册的事件逐一移除实现位于 src/EventManager.php。 小结与延伸阅读要点结论EventManager通配符attach(*, $listener)覆盖该实例全部事件SharedEventManager通配符标识符、事件名可独立或同时用*优先级对全部命中事件统一生效同优先级顺序精确监听器先于通配符监听器移除detach($listener, *)一次清空想进一步上手建议按顺序阅读官方文档doc/book/quick-start.md → doc/book/tutorial.mdWildcards 章节→ doc/book/api.md。掌握通配符监听器后你的 PHP 事件代码将告别重复真正做到一处注册处处响应。赞分享【免费下载链接】zend-eventmanagerImplement event systems, signal slots, intercepting filters, and observers.项目地址https://gitcode.com/gh_mirrors/ze/zend-eventmanager点击查看免费下载相关推荐终极指南如何使用Mitt通配符事件监听捕获所有事件终极指南如何使用Mitt通配符事件监听捕获所有事件 Mitt是一个轻量级的事件发射器库体积不到200字节却提供了强大的事件处理功能。本文将详细介绍如何利用开发工具5分钟搞定多系统启动盘Ventoy让你的U盘变身系统百宝箱5分钟搞定多系统启动盘Ventoy让你的U盘变身系统百宝箱 你是不是还在为每个操作系统准备一个U盘而烦恼或者每次重装系统都要重新格式化启动盘今天我要介绍的操作系统固件开发工具在 React 中通过 SWR Subscription 去重全局事件监听器从 N 个监听器到 1 个监听器在 React 中通过 SWR Subscription 去重全局事件监听器从 N 个监听器到 1 个监听器 导读 在 React 应用中多个组件实例同时订金融科技创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进