如何创建一个事件侦听器吗
编辑该页面警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 2.0,不再维护。
读这个页面的更新版本Symfob娱乐下载ony 6.2(当前的稳定版本)。
如何创建一个事件侦听器吗
ob娱乐下载Symfony有各种事件和钩子,可用于在应用程序中触发定制行为。这些事件抛出HttpKernel组件,可以查看KernelEvents类。
钩到一个事件并添加您自己的自定义逻辑,你必须创建一个服务,它将作为一个事件侦听器事件。在这个条目,您将创建一个服务,它将作为一个异常监听器,允许您修改应用程序如何显示异常。的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 / 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}
请注意
有一个额外的标签选项优先级
这是可选的,默认为0。这个值可以从-255年到255年,和听众的顺序将执行他们的优先级。这是有用的,当你需要保证一个侦听器之前执行另一个。
请求事件,检查类型
一个页面可以使多个请求(一个主请求,然后多个一些子请求),这就是为什么在处理KernelEvents:请求
事件,您可能需要检查请求的类型。能轻松做到这一点:
1 2 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
。