内容简介:几句话熟悉Laravel/Symfony 事件系统
我们知道,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 里事件注册功能 \\Illuminate\\Events\\Dispatcher::listen()
,事件触发功能 \\Illuminate\\Events\\Dispatcher::dispatch()
。
一个事件系统就这么简单。
(3) 一个事件 event 可以有多个处理器 handler/listener,一个 handler/listener 可以监听多个事件,这个应该如何让 event component 支持呢?
要求多个 handler/listener (一个 callable 或是一个 class name)监听一个事件 'event',很简单,那就多次注册 \\Illuminate\\Events\\Dispatcher::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 的事件系统文章,就很简单了,建议仔细阅读下官网这两篇文章。其他细节都是为了上面这些设计目的服务的。
说了这么多,一句话概括: 事件系统就像是框架层的全局数据库,具有存储、注册和触发事件功能,解耦代码,实现跨组件通信
。。
以上所述就是小编给大家介绍的《几句话熟悉Laravel/Symfony 事件系统》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
删除
[英] 维克托•迈尔-舍恩伯格(Viktor Mayer-Schönberger)著 / 袁杰 译 / 浙江人民出版社 / 2013-1 / 49.90元
《删除》讲述了遗忘的美德,为读者展现了大数据时代的取舍之道。 《删除》从大数据时代信息取舍的目的和方法分别诠释了“被遗忘的权利”。维克托首先回溯了人类追寻记忆的过程,之后提出数字技术与全球网络正在瓦解我们天生的遗忘能力。对此,他考察了促进遗忘终止4大驱动力——数字化,廉价的存储器,易于提取,全球性访问。之后,他提出了当前数字化记忆的两大威胁——信息权力与时间,并给出了应对威胁的6大对策——数......一起来看看 《删除》 这本书的介绍吧!
MD5 加密
MD5 加密工具
XML、JSON 在线转换
在线XML、JSON转换工具