事件和事件监听器
编辑本页警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 3.0,现已不再维护。
读本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。
事件和事件监听器
在Symfony应用程序执行期间,会触发大量事件通知ob娱乐下载。您的应用程序可以侦听这些通知,并通过执行任何一段代码来响应它们。
类中定义了Symfony本身提供的内部事件ob娱乐下载KernelEvents类。第三方包和库也会触发许多事件,您自己的应用程序也可以触发这些事件自定义事件.
本文中显示的所有示例都使用相同的方法KernelEvents:异常
事件以保持一致性。在您自己的应用程序中,您可以使用任何事件,甚至在同一个订阅者中混合使用多个事件。
创建事件监听器
监听事件最常见的方法是注册事件监听器:
12 34 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 / AppBundle / EventListener / ExceptionListener.php名称空间AppBundle\EventListener;使用ob娱乐下载\组件\HttpKernel\事件\GetResponseForExceptionEvent;使用ob娱乐下载\组件\HttpFoundation\响应;使用ob娱乐下载\组件\HttpKernel\异常\HttpExceptionInterface;类ExceptionListener{公共函数onKernelException(GetResponseForExceptionEvent$事件){//从接收到的事件中获取异常对象$异常=$事件->getException ();$消息= sprintf ('我的错误显示:%s,代码:%s',$异常->getMessage (),$异常->getCode ());//自定义响应对象以显示异常详细信息$响应=新反应();$响应->setContent ($消息);// HttpExceptionInterface是一个特殊类型的异常//保存状态码和头信息如果($异常运算符HttpExceptionInterface) {$响应->setStatusCode ($异常->getStatusCode ());$响应->头->替换($异常->getHeaders ());}其他的{$响应->setStatusCode(响应::HTTP_INTERNAL_SERVER_ERROR);}//向事件发送修改后的响应对象$事件->setResponse ($响应);}}
提示
每个事件接收的类型略有不同美元的事件
对象。为kernel.exception
事件,它是GetResponseForExceptionEvent.若要查看每个事件侦听器接收的对象类型,请参见KernelEvents或者是关于你正欧宝官网下载app在听的具体事件的文档。
创建了类之后,您只需要将其注册为服务,并通知Symfony它是ob娱乐下载kernel.exception
事件,使用一个特殊的“标签”:
- YAML
- XML
- PHP
1 2 3 4 5 6
# app / config / services.yml服务:app.exception_listener:类:AppBundle \ EventListener \ ExceptionListener标签:-{名称:kernel.event_listener,事件:kernel.exception}
请注意
有一个可选的标记属性称为方法
定义触发事件时执行哪个方法。默认情况下,该方法的名称为在
+“驼峰式事件名称”。如果事件是kernel.exception
默认执行的方法为onKernelException ()
.
另一个可选的标记属性被调用优先级
,默认为0
它还控制侦听器的执行顺序(优先级越高,侦听器就越早执行)。当您需要保证一个侦听器在另一个侦听器之前执行时,这很有用。内部Symfony侦听器的优先级通常从ob娱乐下载-255年
来255
但是您自己的侦听器可以使用任何正整数或负整数。
创建事件订阅服务器
监听事件的另一种方法是通过事件订阅者,这是一个定义了一个或多个侦听一个或多个事件的方法的类。与事件侦听器的主要区别是订阅者总是知道它们正在侦听哪些事件。
在给定的订阅者中,不同的方法可以侦听相同的事件。方法的执行顺序由优先级
每个方法的参数(优先级越高的方法越早被调用)。要了解有关事件订阅者的更多信息,请阅读EventDispatcher组件.
下面的示例显示了一个事件订阅器,它定义了几个侦听相同事件的方法kernel.exception
事件:
12 34 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 / AppBundle / EventSubscriber / ExceptionSubscriber.php名称空间AppBundle\EventSubscriber;使用ob娱乐下载\组件\EventDispatcher\EventSubscriberInterface;使用ob娱乐下载\组件\HttpKernel\事件\GetResponseForExceptionEvent;使用ob娱乐下载\组件\HttpKernel\KernelEvents;类ExceptionSubscriber实现了EventSubscriberInterface{公共静态函数getSubscribedEvents(){//返回订阅的事件及其方法和优先级返回数组(KernelEvents::异常= >数组(数组(“processException”,10),数组(“logException”,0),数组(“notifyException”,-10),));}公共函数processException(GetResponseForExceptionEvent$事件){/ /……}公共函数logException(GetResponseForExceptionEvent$事件){/ /……}公共函数notifyException(GetResponseForExceptionEvent$事件){/ /……}}
现在,您只需要将类注册为服务并添加kernel.event_subscriber
标记告诉Symfony这ob娱乐下载是一个事件订阅器:
- YAML
- XML
- PHP
1 2 3 4 5 6
# app / config / services.yml服务:app.exception_subscriber:类:AppBundle \ EventSubscriber \ ExceptionSubscriber标签:-{名称:kernel.event_subscriber}
请求事件,检查类型
一个页面可以发出几个请求(一个主请求,然后是多个子请求——通常由如何在模板中嵌入控制器).对于核心Symfony事件ob娱乐下载,你可能需要检查事件是“主”请求还是“子请求”:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
/ / src / AppBundle / EventListener / RequestListener.php名称空间AppBundle\EventListener;使用ob娱乐下载\组件\HttpKernel\事件\GetResponseEvent;使用ob娱乐下载\组件\HttpKernel\HttpKernel;使用ob娱乐下载\组件\HttpKernel\HttpKernelInterface;类RequestListener{公共函数onKernelRequest(GetResponseEvent$事件){如果(!$事件->isMasterRequest ()) {//如果不是主请求就不做任何事情返回;}/ /……}}
有些事情,比如查看信息真正的请求时,可能不需要对子请求监听器进行处理。
监听器或订阅器
侦听器和订阅者可以在同一个应用程序中使用。使用它们中的任何一种通常是个人喜好的问题。然而,它们都有一些小优点:
- 订阅者更容易重用因为事件的知识保存在类中,而不是服务定义中。这就是Symfony内部使用订阅者的原因;ob娱乐下载
- 听众更灵活因为bundle可以根据某些配置值有条件地启用或禁用它们。
调试事件监听器
您可以使用控制台找出在事件调度程序中注册了哪些侦听器。要显示所有事件及其监听器,运行:
1
$ PHP bin/控制台调试:event-dispatcher
你可以通过指定某个事件的名称来获取它的注册监听器:
1
$ PHP bin/控制台调试:event-dispatcher kernel.exception