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

汽车4s网站设计谷歌seo推广招聘

汽车4s网站设计,谷歌seo推广招聘,龙岗高端网站设计专家,wordpress 搜索增强​ 大家好,这篇文章将通过我在实际开发工作中的例子,来介绍Symfony的EventDispatcher组件的使用及实现原理。 这个组件在实际开发过程中非常的有用,它能够使代码的业务逻辑变的非常清晰,增加代码的复用性,代码的耦合性…

大家好,这篇文章将通过我在实际开发工作中的例子,来介绍Symfony的EventDispatcher组件的使用及实现原理。

这个组件在实际开发过程中非常的有用,它能够使代码的业务逻辑变的非常清晰,增加代码的复用性,代码的耦合性也大大降低。

简介
具体的介绍大家可以查看官方的文档,下面是文档地址。

文档地址

组成
一个 dispatcher 对象,保存了事件名称和其对应监听器
一个 event,有一个全局唯一的事件名称。包含一些在订阅器里需要访问的对象。
使用示例
1. 初始化,添加相应监听事件

# 初始时,添加监听器
$dispatcher = new EventDispatcher();$disptacher->addSubscriber(new BIReportSubscriber());   // BI上报功能
$disptacher->addSubscriber(new MediaPlayerSubscriber());  // 维护播放器信息统一

  1. Symfony\Component\EventDispatcher\EventDispatcher

2. 监听的事件

class BIReportSubscriber implements EventSubscriberInterface
{public static function getSubscribedEvents (){// 监听的不同事件,当事件触发时,会调用 onResponse 方法return [MusicResponseEvent::NAME => 'onResponse',  ChildrenResponseEvent::NAME => 'onResponse',FmResponseEvent::NAME => 'onResponse',NewsResponseEvent::NAME => 'onResponse',];}public function onResponse(AResponseEvent $event){/** 一些具体的业务逻辑* 进行 BI 上报*/}

class MediaPlayerSubscriber implements EventSubscriberInterface
{public static function getSubscribedEvents (){return [MusicResponseEvent::NAME => 'onResponse',FmResponseEvent::NAME => 'onResponse',ChildrenResponseEvent::NAME => 'onResponse',NewsResponseEvent::NAME => 'onResponse',];}public function onResponse(AResponseEvent $event){/** 一些具体的业务逻辑* 维护播放器信息统一*/}

实现 getSubscribedEvents 方法,完成事件的绑定。当事件触发时,dispatcher 会调用绑定的方法,并将抛出的事件当做参数传入。
事件绑定的方法 onResponse 可以是任何名字。
在 onResponse 方法中,通过 $event 获取要操作的对象。
3. 事件代码

class FmResponseEvent extends Event
{const NAME = 'fm.response';  // 事件名,事件的唯一标识protected $request;  // 在监听器里要操作的对象protected $response;  // 在监听器里要操作的对象public function __construct (Request $request, Response $response){$this->request = $request;$this->response = $response;}/*** @return Request*/public function getRequest(){return $this->request;}/*** @return Response*/public function getResponse(){return $this->response;}
}

  1. 继承 Symfony\Component\EventDispatcher\Event
  2. 在订阅器的业务逻辑上,需要使用 $request 和 $response 对象,所以本事件包含这两个类的对象。

4. 触发事件

$event = new FmResponseEvent($request, $response);$dispatcher->dispatch($event::NAME, $event);

  1. dispathcer 会按照优先级,依次执行订阅器中事件绑定的方法

原码解读

1 简化的 EventDispatcher 源码

class EventDispatcher implements EventDispatcherInterface
{private $listeners = array();private $sorted = array();/*** 触发事件*/public function dispatch($eventName, Event $event){if ($listeners = $this->getListeners($eventName)) {$this->doDispatch($listeners, $eventName, $event);}return $event;}/***  根据事件名,搜索监听器*/public function getListeners($eventName){if (empty($this->listeners[$eventName])) {return array();}if (!isset($this->sorted[$eventName])) {$this->sortListeners($eventName);}return $this->sorted[$eventName];}/*** 换优先级将监听器排序* @param string $eventName*/private function sortListeners($eventName){krsort($this->listeners[$eventName]);$this->sorted[$eventName] = array();foreach ($this->listeners[$eventName] as $priority => $listeners) {foreach ($listeners as $k => $listener) {if (\is_array($listener) && isset($listener[0]) && $listener[0] instanceof \Closure) {$listener[0] = $listener[0]();$this->listeners[$eventName][$priority][$k] = $listener;}$this->sorted[$eventName][] = $listener;}}}protected function doDispatch($listeners, $eventName, Event $event){foreach ($listeners as $listener) {if ($event->isPropagationStopped()) {break;}\call_user_func($listener, $event, $eventName, $this);}/*** 添加订阅器*/public function addSubscriber(EventSubscriberInterface $subscriber){foreach ($subscriber->getSubscribedEvents() as $eventName => $params) {if (is_string($params)) {$this->addListener($eventName, array($subscriber, $params));} elseif (is_string($params[0])) {$this->addListener($eventName, array($subscriber, $params[0]), isset($params[1]) ? $params[1] : 0);} else {foreach ($params as $listener) {$this->addListener($eventName, array($subscriber, $listener[0]), isset($listener[1]) ? $listener[1] : 0);}}}}public function addListener($eventName, $listener, $priority = 0){$this->listeners[$eventName][$priority][] = $listener;unset($this->sorted[$eventName]);}
}

Buy me a cup of coffee :)

http://www.lbrq.cn/news/2609821.html

相关文章:

  • 昆明建设厅网站网站seo入门基础教程书籍
  • 佛山网站建设哪家专业青岛seo网络推广
  • 织梦农家乐网站模板上海今天刚刚发生的新闻
  • 电子商务网站建设与管理笔试一键制作免费网站的app
  • 网站建设主要包括前台和后台拼多多推广引流软件免费
  • 什么叫 营销型网站网络营销带来的效果
  • 品牌网站建设搭建搜索引擎搜索器
  • 科技部火炬中心关键词优化报价推荐
  • 网站编辑合适内向的人做吗竞价代运营公司
  • 做电视的视频网站吗怎么申请域名建网站
  • 山东平台网站建设方案5151app是交友软件么
  • 肥西上派网站开发上海做seo的公司
  • 产品做优化好还是超级网站好太原网站建设谁家好
  • 怎么自己做网站卖东西重庆排名seo公司
  • wordpress 域名插件重庆公司网站seo
  • 成都中小企业网站建设建网站软件
  • 南宁定制网站建设网络营销的模式有哪些?
  • 政府网站建设公司西安关键词快速排名
  • 网站栏目及内容衡阳seo优化报价
  • 重庆建设厂招聘信息网站软文推荐
  • 芷江建设工程招投标网站中国最新消息新闻
  • 深圳专业集团网站建设百度指数什么意思
  • 做网站需要多少钱知乎百度图片识别在线使用
  • 长沙做网站 必看 磐石网络上海关键词优化排名软件
  • pbootcms快速仿站西安网站推广慧创科技
  • wordpress清理数据库的垃圾文件广州推动优化防控措施落地
  • 网站开发华企云商信息流投放
  • .net网站方案充电宝seo关键词优化
  • 合肥高端网站开发seo网络优化师就业前景
  • 如何做网站frontpage中国十大品牌营销策划公司
  • Go语言数据类型深度解析:位、字节与进制
  • Redis之Set和SortedSet类型常用命令
  • 永磁同步电机的矢量控制
  • 使用公众号的消息模板给关注用户发消息
  • Sklearn 机器学习 数据聚类 层次聚类的两个重要属性
  • 深入理解 Android SO 导出符号:机制与安全优化