事件和事件监听器

编辑该页面

事件和事件监听器

Symfony应用程序执行期间,大量的触发事件通知。ob娱乐下载您的应用程序可以听这些通知和应对他们通过执行任何代码。

ob娱乐下载Symfony触发几个事件相关的内核在处理HTTP请求。第三方包也可能分派事件,你甚至可以派遣自定义事件从您自己的代码。

本文中所示的示例使用相同KernelEvents:异常事件的一致性的目的。在您自己的应用程序中,您可以使用任何事件,甚至混合其中几个在同一用户。

创建一个事件监听器

听一个事件最常见的方法是注册一个事件监听器:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27 28 29 30 31 32 33 34 35 36
/ / src / EventListener / ExceptionListener.php名称空间应用程序\EventListener;使用ob娱乐下载\组件\HttpFoundation\响应;使用ob娱乐下载\组件\HttpKernel\事件\ExceptionEvent;使用ob娱乐下载\组件\HttpKernel\异常\HttpExceptionInterface;ExceptionListener{公共函数onKernelException(ExceptionEvent美元事件){/ /得到的异常对象接收到的事件美元异常=美元事件- >getThrowable ();美元消息= sprintf (我的错误说:% s代码:% s的,美元异常- >getMessage (),美元异常- >getCode ());/ /定制响应对象显示异常的细节美元响应=反应();美元响应- >setContent (美元消息);/ / HttpExceptionInterface是一种特殊类型的异常/ /保存状态代码和头的细节如果(美元异常运算符HttpExceptionInterface) {美元响应- >setStatusCode (美元异常- >getStatusCode ());美元响应- >- >替换(美元异常- >getHeaders ());}其他的{美元响应- >setStatusCode(响应::HTTP_INTERNAL_SERVER_ERROR);}/ /发送修改后的响应对象的事件美元事件- >setResponse (美元响应);}}

提示

每个事件接收一个稍微不同的类型的美元的事件对象。为kernel.exception事件,ExceptionEvent。检查ob娱乐下载Symfony事件参考每个事件提供什么类型的对象。

现在创建了类,你需要注册一个服务并通知Symfony,它是一个“听众”ob娱乐下载kernel.exception事件通过使用一个特殊的“标签”:

  • YAML
  • XML
  • PHP
1 2 3 4 5
#配置/ services.yaml服务:App \ EventListener \ ExceptionListener:标签:- - - - - -{名称:kernel.event_listener,事件:kernel.exception}

ob娱乐下载Symfony遵循这种逻辑来确定调用哪个方法内的事件侦听器类:

  1. 如果kernel.event_listener标签定义了方法属性,将被调用的方法的名称;
  2. 如果没有方法定义属性,尝试调用的方法的名称+“PascalCased事件名称”(如。onKernelException ()方法kernel.exception事件);
  3. 如果没有定义方法,试图调用__invoke ()魔术方法(这使得事件监听器调用);
  4. 如果__invoke ()方法也不是定义,抛出一个异常。

请注意

有一个可选属性kernel.event_listener标签被称为优先级,这是一个积极或消极的整数,默认0和它控制的顺序执行侦听器(数字越高,越早一个侦听器执行)。这是有用的,当你需要保证一个侦听器之前执行另一个。内部的优先级Symfony听众通常范围从ob娱乐下载-256年256年但自己的听众可以使用任何积极或消极的整数。

定义事件侦听器使用PHP属性

另一种方法来定义一个事件侦听器是使用AsEventListenerPHP属性。这使得配置监听器在它的类,而无需添加任何配置在外部文件:

1 2 3 4 5 6 7 8 9 10 11 12
名称空间应用程序\EventListener;使用ob娱乐下载\组件\EventDispatcher\属性\AsEventListener;# (AsEventListener)最后MyListener{公共函数__invoke(CustomEvent美元事件):无效{/ /……}}

您可以添加多个# (AsEventListener ())属性来配置不同的方法:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21日22日23日24
名称空间应用程序\EventListener;使用ob娱乐下载\组件\EventDispatcher\属性\AsEventListener;# (AsEventListener(事件:CustomEvent::类,方法:onCustomEvent))#【AsEventListener(事件:“foo”,优先级:42))#【AsEventListener(事件:“酒吧”,方法:onBarEvent))最后MyMultiListener{公共函数onCustomEvent(CustomEvent美元事件):无效{/ /……}公共函数onFoo():无效{/ /……}公共函数onBarEvent():无效{/ /……}}

创建一个事件订阅者

听事件的另一种方法是通过一个事件订阅者,这是一个类,它定义了一个或多个方法,听一个或各种事件。事件监听器的主要区别是,用户总是知道他们听的事件。

如果不同的事件订阅者的方法听同样的事件,它们被定义的顺序优先级参数。这个值是默认为一个积极的还是消极的整数0。数越高,越早的方法。首要任务是聚合所有听众和订阅者,所以你的方法可以调用之前或之后在其他听众和用户定义的方法。了解更多关于事件订阅者,阅读EventDispatcher组件

下面的示例显示了一个事件订阅者,定义了一些方法,听一样的kernel.exception事件:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27 28 29 30 31 32 33 34 35 36
/ / src / EventSubscriber / ExceptionSubscriber.php名称空间应用程序\EventSubscriber;使用ob娱乐下载\组件\EventDispatcher\EventSubscriberInterface;使用ob娱乐下载\组件\HttpKernel\事件\ExceptionEvent;使用ob娱乐下载\组件\HttpKernel\KernelEvents;ExceptionSubscriber实现了EventSubscriberInterface{公共静态函数getSubscribedEvents(){/ /返回订阅事件,他们的方法和重点返回[KernelEvents::异常= > [[“processException”,10]、[“logException”,0]、[“notifyException”,-10年)));}公共函数processException(ExceptionEvent美元事件){/ /……}公共函数logException(ExceptionEvent美元事件){/ /……}公共函数notifyException(ExceptionEvent美元事件){/ /……}}

就是这样!你的services.yaml文件应该已经设置加载服务的EventSubscriber目录中。ob娱乐下载Symfony的休息。

提示

如果你的方法时调用将抛出一个异常,检查你的加载服务EventSubscriber目录,可以使用autoconfigure启用。你也可以手动添加kernel.event_subscriber标签。

请求事件,检查类型

一个页面可以使多个请求(一个主要的要求,那么多个子请求,通常当在模板中嵌入控制器)。核心Symfony的事件,ob娱乐下载您可能需要检查的事件是“主要”请求或“子请求”:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
/ / src / EventListener / RequestListener.php名称空间应用程序\EventListener;使用ob娱乐下载\组件\HttpKernel\事件\RequestEvent;RequestListener{公共函数onKernelRequestRequestEvent (美元事件){/ / isMainRequest()方法是在Symfony 5.3中引入的。ob娱乐下载/ /在以前的版本中它被称为isMasterRequest ()如果(!美元事件- >isMainRequest ()) {/ /不做任何事如果不是主要的请求返回;}/ /……}}

某些事情,比如检查信息真正的请求,可能不需要做sub-request听众。

听众或用户

听众和用户可以在同一个应用程序中朦胧地。使用他们的决定通常是个人口味的问题。然而,他们每个人有一些小的优势:

  • 用户更容易重用因为事件是在类的知识,而不是在服务定义。这就是为什么Symfony使用内部用户;ob娱乐下载
  • 听众更加灵活因为包可以启用或禁用他们每个人有条件地根据一些配置值。

事件的别名

当配置事件监听器和订阅者通过依赖注入,Symfony的核心事件也可以被完全限定类名(FQCN)对应的事件类的:ob娱乐下载

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
/ / src / EventSubscriber / RequestSubscriber.php名称空间应用程序\EventSubscriber;使用ob娱乐下载\组件\EventDispatcher\EventSubscriberInterface;使用ob娱乐下载\组件\HttpKernel\事件\RequestEvent;RequestSubscriber实现了EventSubscriberInterface{公共静态函数getSubscribedEvents():数组{返回RequestEvent [::类= >“onKernelRequest”,);}公共函数onKernelRequestRequestEvent (美元事件){/ /……}}

在内部,事件FQCN被当作原始事件名称的别名。因为映射已经发生编译服务容器时,事件监听器和订阅者使用FQCN代替事件名称将出现在最初的事件名称时检查事件调度器。

这个别名映射可以扩展自定义事件通过注册编译器通过AddEventAliasesPass:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/ / src / Kernel.php名称空间应用程序;使用应用程序\事件\MyCustomEvent;使用ob娱乐下载\组件\DependencyInjection\ContainerBuilder;使用ob娱乐下载\组件\EventDispatcher\DependencyInjection\AddEventAliasesPass;使用ob娱乐下载\组件\HttpKernel\内核作为BaseKernel;内核扩展BaseKernel{受保护的函数构建(ContainerBuilder美元容器){美元容器- >addCompilerPass (AddEventAliasesPass ([MyCustomEvent::类= >“my_custom_event”)));}}

编译器通过将永远扩展现有的别名列表。正因为如此,它是安全注册的多个实例通过不同的配置。

调试事件监听器

你可以找出监听器注册事件调度器使用控制台。显示所有事件和他们的听众,运行:

1
美元php bin /控制台调试:事件分配器

你可以为一个特定的事件注册监听器通过指定它的名字:

1
美元php bin /控制台调试:事件分配器kernel.exception

或者可以把一切部分匹配事件名称:

1 2
美元php bin /控制台调试:事件分配器内核/ /匹配“kernel.exception”,“kernel.response”等。美元php bin /控制台调试:事件分发安全/ /匹配“ob娱乐下载Symfony Http \ \安全\ \组件事件\ CheckPassportEvent”

5.3

能力匹配部分事件名称是在Symfony 5.3中引入的。ob娱乐下载

安全系统使用一个事件分配器/防火墙。使用——调度员选择的特定事件分配器:注册监听器

1
美元php bin /控制台调试:事件分配器,分配器= security.event_dispatcher.main

5.3

调度程序选项是在Symfony 5.3中引入的。ob娱乐下载

这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。
ob娱乐下载Symfony 5.4支持通过私人Packagist