如何创建事件监听器
编辑本页警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 2.1,现已不再维护。
读本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。
如何创建事件监听器
ob娱乐下载Symfony有各种事件和钩子,可用于触发应用程序中的自定义行为。这些事件是由HttpKernel组件抛出的,可以在HttpKernel组件中查看KernelEvents类。
要连接到事件并添加您自己的自定义逻辑,您必须创建一个服务,该服务将充当该事件的事件侦听器。在本条目中,您将创建一个充当Exception Listener的服务,允许您修改应用程序显示异常的方式。的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 / Acme / DemoBundle / EventListener / AcmeExceptionListener.php名称空间Acme\DemoBundle\EventListener;使用ob娱乐下载\组件\HttpKernel\事件\GetResponseForExceptionEvent;使用ob娱乐下载\组件\HttpFoundation\响应;使用ob娱乐下载\组件\HttpKernel\异常\HttpExceptionInterface;类AcmeExceptionListener{公共函数onKernelException(GetResponseForExceptionEvent$事件){//从接收到的事件中获取异常对象$异常=$事件->getException ();$消息= sprintf ('我的错误显示:%s,代码:%s',$异常->getMessage (),$异常->getCode ());//自定义响应对象以显示异常详细信息$响应=新反应();$响应->setContent ($消息);// HttpExceptionInterface是一个特殊类型的异常//保存状态码和头信息如果($异常运算符HttpExceptionInterface) {$响应->setStatusCode ($异常->getStatusCode ());$响应->头->替换($异常->getHeaders ());}其他的{$响应->setStatusCode (500);}//向事件发送修改后的响应对象$事件->setResponse ($响应);}}
提示
每个事件接收的类型略有不同美元的事件
对象。为kernel.exception
事件,它是GetResponseForExceptionEvent.若要查看每个事件侦听器接收的对象类型,请参见KernelEvents.
创建了类之后,您只需要将其注册为服务,并通知Symfony它是ob娱乐下载kernel.exception
事件,使用一个特殊的“标签”:
- YAML
- XML
- PHP
1 2 3 4 5 6
# app / config / config.yml服务:kernel.listener.your_listener_name:类:Acme \ DemoBundle \ EventListener \ AcmeExceptionListener标签:-{名称:kernel.event_listener,事件:kernel.exception,方法:onKernelException}
1 2 3 4
<!--app/config/config.xml --><服务id=“kernel.listener.your_listener_name”类=“Acme \ DemoBundle \ EventListener \ AcmeExceptionListener”><标签的名字=“kernel.event_listener”事件=“kernel.exception”方法=“onKernelException”/>服务>
1 2 3 4 5
/ / app / config / config . php$容器->注册(“kernel.listener.your_listener_name”,“Acme \ DemoBundle \ EventListener \ AcmeExceptionListener”)->addTag (“kernel.event_listener”,数组(“事件”= >“kernel.exception”,“方法”= >“onKernelException”));
请注意
还有一个额外的标记选项优先级
这是可选的,默认为0。该值可以是-255到255,侦听器将按照优先级顺序执行。当您需要保证一个侦听器在另一个侦听器之前执行时,这很有用。
请求事件,检查类型
一个页面可以发出多个请求(一个主请求,然后是多个子请求),这就是为什么在使用KernelEvents:请求
事件时,您可能需要检查请求的类型。这可以很容易地做到如下:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
/ / src / Acme / DemoBundle / EventListener / AcmeRequestListener.php名称空间Acme\DemoBundle\EventListener;使用ob娱乐下载\组件\HttpKernel\事件\GetResponseEvent;使用ob娱乐下载\组件\HttpKernel\HttpKernel;类AcmeRequestListener{公共函数onKernelRequest(GetResponseEvent$事件){如果(HttpKernel::MASTER_REQUEST ! =$事件->getRequestType ()) {//如果不是主请求就不做任何事情返回;}/ /……}}
提示
类中有两种类型的请求HttpKernelInterface接口:HttpKernelInterface: MASTER_REQUEST
而且HttpKernelInterface: SUB_REQUEST
.