资讯专栏INFORMATION COLUMN

几句话熟悉Laravel/Symfony 事件系统

bitkylin / 3266人阅读

摘要:一个事件系统就这么简单。说了这么多,一句话概括事件系统就像是框架层的全局数据库,具有存储注册和触发事件功能,解耦代码,实现跨组件通信。。

我们知道,laravel/symfony 框架是由一堆堆 components 组件粘合在一起的。其中会有一个 event component 组件,比较特殊,它像一个中介,是框架层全局 component,专门负责不同component间相互通信传数据的。

说它是全局的,意思是,整个请求生命周期内,event 对象是单例的,对象不能新建实例,每次从容器中获取标识为 "event" 的 event 对象还是最开始的 event 对象,为啥要这样搞?很简单啊,如果不是单例的,那第一个 event component 里注册了 10 个事件 event,在某个 component 里想要触发 event 对象里的一个发邮件事件 "mail",但如果此时从容器中拿到的 event component 不是原来的 event component,那就找不到那个 mail 事件对应的处理器 handler 了。可以看看 laravel 的 EventServiceProvider 在往容器中注册 "event" 对象时是使用的 singleton() 单例注册的,这样保证 event 对象永远是那一个。

说它负责跨组件通信,意思是比如对于 database 下的一个 model 对象如 account model,当逻辑处理到 save 完一个 account model 到数据库时,如果需要再增加几个逻辑,如发个邮件 mail,数据入数据库前需要验证 validation,给这个 account 写个日志 log 等等,这几个逻辑需要 Mail Component/Validation Component/Log Component 里面的对象去处理,难道我要在 $account->save() 的后面在写一大坨这些逻辑?那代码岂不乱七八糟。何况我想在 save 前和 save 后再搞一些逻辑,那不完蛋了。有没有这样一种实践方式让我 save 前一两行代码,save 后一两行代码,把这些逻辑解耦为各个小逻辑呢,这样代码岂不更清爽。

(1) 为啥需要事件系统?

代码层面,为了代码解耦,把在一处的一大坨逻辑解耦成多处细分代码;性能考虑,事件的队列功能模拟了异步处理,把耗时的任务放在队列里,让队列一个个去慢慢处理这些任务。

(2) 事件架构是如何构成的?

事件架构其实很简单,它是一个框架层的全局 component: event component,通过上面的描述知道它应该具备几个功能: 事件注册功能事件触发功能,再加一个高级功能把事件放在队列里异步处理,如 laravel 里事件注册功能IlluminateEventsDispatcher::listen(),事件触发功能IlluminateEventsDispatcher::dispatch()

一个事件系统就这么简单。

(3) 一个事件 event 可以有多个处理器 handler/listener,一个 handler/listener 可以监听多个事件,这个应该如何让 event component 支持呢?

要求多个 handler/listener (一个 callable 或是一个 class name)监听一个事件 "event",很简单,那就多次注册IlluminateEventsDispatcher::listen($event_name, $handler),$event_name 一样,$handler 不一样而已,会按照注册顺序执行 $handler,当然 symfony 支持在第三个参数就是 priority,设置 $handler 执行顺序。
要求一个 handler/listener 可以监听多个 event,很简单,把 handler 做成一个类 class,然后里面做个 $events 数组属性设置要监听哪些 events 就行,laravel/symfony 都叫这个 handler 为 Event Subscribers,仅此而已。

不想去画图来详细说明了,根据上面几句话,再去从架构层面去看 laravel event / symfony event 的事件系统文章,就很简单了,建议仔细阅读下官网这两篇文章。其他细节都是为了上面这些设计目的服务的。

说了这么多,一句话概括:事件系统就像是框架层的全局数据库,具有存储、注册和触发事件功能,解耦代码,实现跨组件通信。。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/26311.html

相关文章

  • PHP 5.6,7.0,7.1,7.2 和 HHVM 运行效率比较

    摘要:测试运行多次并取平均值。文章数量测试的基准测试基准测试结果基准测试结果基准测试结果基准测试结果基准测试结果基准测试结果不支持再次成为冠军请注意的运行环境需要或以上。同时,再次不能正常工作并抛出错误。 showImg(https://segmentfault.com/img/remote/1460000013690286); 我们每年都会尝试深入了解不同版本的 PHP 和 HHVM 在各...

    cnTomato 评论0 收藏0
  • 现在写 PHP,你应该知道这些

    摘要:首先你应该是在用以上的版本,如果版本在这之下,是时候该升级了。按照其官网的说法,这个组织的目的并不是告诉你你应该怎么做,只是一些主流的框架之间相互协商和约定。和没有出现在以上的列表中,是因为还没有投票通过。不要被这些话所困扰。 首先你应该是在用 PHP 5.3 以上的版本,如果 PHP 版本在这之下,是时候该升级了。我建议如果有条件,最好使用最新的版本。 你应该看过 PHP The R...

    supernavy 评论0 收藏0
  • Swoft| Swoft 框架组件化改造

    摘要:框架组件化改造框架从单体应用到组件化改造的架构升级之路经过一年多的开发框架功能越来越完善也越来越复杂初创时期的单体应用已经无法支撑项目的快速发展于是开发组在年前为版制定了组件化改造的重构方案内容速览组件化原理包管理基础知识组件化方案来 date: 2018-3-21 13:22:16title: Swoft| Swoft 框架组件化改造description: Swoft 框架从单体应...

    desdik 评论0 收藏0
  • 2019 PHP程序员发展路线

    摘要:在年我参加兄弟连的培训,成为一名程序员。我认为成为程序员的有以下三种途径。为大家准备了一份年程序员发展路线。可见也可以关注下上个时代框架霸主他的新版本可能会有奇迹发生扩展异步编程框架这个就不必多说了。 showImg(https://segmentfault.com/img/bVbmMdM?w=640&h=364); 我一生的文章都会放在这里,我的博客,我希望每一行代码,每一段文字都能...

    MangoGoing 评论0 收藏0
  • 2017 非标准 PHP 框架性能测试比较

    摘要:我最近在给完善说明文档有一节是性能测试比较才有了下面这个项目项目托管地址针对上比较活跃的几个开源项目,做了简单的比较。供大家参考所有框架仅输出就仅测试框架的本身的性能。如果有精力可以测下带有数据库交互的测试。祝国内产生更多优秀的开源产品 我最近在给tastphp 完善说明文档 有一节是性能测试比较 ,才有了下面这个项目 项目托管地址: https://github.com/xujiaj...

    aikin 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<