如何创建事件监听器

编辑本页

警告:您正在浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 2.6,现已不再维护。

本页的更新版本用于Sy欧宝娱乐app下载地址mfony 6.2(当前稳定版本)。

如何创建事件监听器

欧宝娱乐app下载地址Symfony有各种事件和钩子,可用于触发应用程序中的自定义行为。这些事件是由HttpKernel组件抛出的,可以在HttpKernel组件中查看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 / AcmeExceptionListener.php名称空间AppBundleEventListener使用欧宝娱乐app下载地址组件HttpKernel事件GetResponseForExceptionEvent使用欧宝娱乐app下载地址组件HttpFoundation响应使用欧宝娱乐app下载地址组件HttpKernel异常HttpExceptionInterfaceAcmeExceptionListener公共函数onKernelException(GetResponseForExceptionEvent事件//从接收到的事件中获取异常对象异常事件->getException ();消息= sprintf ('我的错误显示:%s,代码:%s'异常->getMessage (),异常->getCode ());//自定义响应对象以显示异常详细信息响应反应();响应->setContent (消息);// HttpExceptionInterface是一个特殊类型的异常//保存状态码和头信息如果异常运算符HttpExceptionInterface) {响应->setStatusCode (异常->getStatusCode ());响应->->替换(异常->getHeaders ());}其他的响应->setStatusCode(响应::HTTP_INTERNAL_SERVER_ERROR);}//向事件发送修改后的响应对象事件->setResponse (响应);}}

提示

每个事件接收的类型略有不同美元的事件对象。为kernel.exception事件,它是GetResponseForExceptionEvent.若要查看每个事件侦听器接收的对象类型,请参见KernelEvents

请注意

属性的响应时kernel.requestkernel.viewkernel.exception事件,传播将停止,因此该事件的低优先级侦听器不会被调用。

创建了类之后,您只需要将其注册为服务,并通知Symfony它是欧宝娱乐app下载地址kernel.exception事件,使用一个特殊的“标签”:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6
# app / config / services.yml服务:kernel.listener.your_listener_name:类:AppBundle \ EventListener \ AcmeExceptionListener标签:-名称:kernel.event_listener,事件:kernel.exception,方法:onKernelException

请注意

还有一个额外的标记选项优先级这是可选的,默认为0。侦听器将按照优先级(从高到低)的顺序执行。当您需要保证一个侦听器在另一个侦听器之前执行时,这很有用。

请求事件,检查类型

一个页面可以发出多个请求(一个主请求,然后是多个子请求),这就是为什么在使用KernelEvents:请求事件时,您可能需要检查请求的类型。这可以很容易地做到如下:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
/ / src / AppBundle / EventListener / AcmeRequestListener.php名称空间AppBundleEventListener使用欧宝娱乐app下载地址组件HttpKernel事件GetResponseEvent使用欧宝娱乐app下载地址组件HttpKernelHttpKernelAcmeRequestListener公共函数onKernelRequest(GetResponseEvent事件如果(!事件->isMasterRequest ()) {//如果不是主请求就不做任何事情返回;}/ /……}}

提示

类中有两种类型的请求HttpKernelInterface接口:HttpKernelInterface: MASTER_REQUEST而且HttpKernelInterface: SUB_REQUEST

调试事件监听器

2.6

调试:事件分配器命令在Symfony 2.6中引入。欧宝娱乐app下载地址

您可以使用控制台找出在事件调度程序中注册了哪些侦听器。要显示所有事件及其监听器,运行:

1
$ PHP应用程序/控制台调试:事件分派器

你可以通过指定某个事件的名称来获取它的注册监听器:

1
$ PHP应用/控制台调试:event-dispatcher kernel.exception
此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。