Symfony2 HttpKernel事件驱动


kernel.request Event


RouterListener是Symfony框架中实现kernel.request事件的最重要监听器,RouterListener在路由层中执行,返回一个包含符合当前请求的路由信息的数组,例如路由匹配模式里面的_controller和请求的参数({name})。这些信息都会存放在Request里的attributes数组里面,目前只是会添加路由信息到Request对象中还没有做其它的动作,但是解析Controller的时候会被用到。
2) Resolve the Controller




解析ControllerSymfony框架使用内置的ControllerResolver(实质上是使用了一个有额外的功能的子类),该解析器利用了RouterListener保存到Request对象的attributes属性里信息来确定controller。getControllerControllerResolver 在Request对象的attributes数组中查找 _controller 键(这些信息实际上是由RouterListener存放进Request对象中的):a) 如果_controller 键对应AcmeDemoBundle:Default:index 这个格式的值,那么该值就包含了类名和方法名,可以被Symfony框架解析成为,例如:Acme\DemoBundle\Controller\DefaultController::indexAction,这个转换是由Symfony框架的特定的ControllerResolver的子类完成的。b) 你的controller类会被实例化,而且该controller类必须包含一个无参的构造函数。c) 如果你的controller还实现了ContainerAwareInterface,那么setContainer方法就会被调用,container就会被注入到controller中,这个实现也是由Symfony框架的特定的ControllerResolver的子类完成的。上面也有一些其他变化过程,例如你把你的controller配置成为service。
3) The kernel.controller Event
kernel.controllerkernel.controller事件是在controller被执行前初始化一些信息或者改变controller对象。
被调用的controller确定之后,HttpKernel::handle()就会调度kernel.controller事件。在系统的某部分被确定后(例如:controller、路由信息等)但是这些部分被执行前,监听kernel.controller事件的监听器就会运行了。


kernel.controllerSymfony框架有几个kernel.controller事件的监听器,多数都是处理分析数据的。SensioFrameworkExtraBundle中一个监听器ParamConverter允许我们把一个对象作为参数传入到controller中,而不是字符串或者数值参数。


到了这一步,kernel已经获得了controller和controller运行时需要的参数了。
Symfony框架获得controller的参数
ControllerResolver使用放射机制获得被调用的controller的方法的参数列表。遍历该列表,使用下面的步骤来确定参数列表中一一对应的值:
a) 使用参数作为键查找Request对象中的attributes数组,如果找到,那么相应的值会传入到controller的方法中,例如:controller方法的第一个参数是$name,那么在Request的attributes数组中包含$attributes['name']的值,那么$attributes['name']就会被使用。
b) 如果该该参数在Symfony配置routing的时候被指定,那么就会跳过对该参数的查找。
5)调用controller


controller必须要有返回值,如果返回null,程序会报错
6) kernel.view事件
controller返回值不是Response对象的时候被触发。


Response.Symfony框架中实现kernel.view事件
Symfony框架中没有缺省的监听器实现kernel.view事件,可是,有一个核心Bundle——SensioFrameworkExtraBundle里有个监听改事件的监听器。如果你的controller返回一个数组,并且在controller类的顶部有@Template的注解,那么该监听器就会渲染一个模板,把controller返回的数组传入到模板中,最后利用模板返回的内容创建一个Response对象,并返回该Response对象。除此之外,FOSRestBundle也实现了监听该事件的监听器,a listener on this event which aims to give you a robust view layer capable of using a single controller to return many different content-type responses (e.g. HTML, JSON, XML, etc).
Symfony框架实现kernel.response事件Symfony框架内置几个监听器监听kernel.response事件,更多的可以通过开发者社区获得。例如:在dev开发环境下WebDebugToolbarListener向页面的底部注入javascript代码,debug工具条就会显示出来。还有另一个监听器,ContextListener序列化当前用户的信息保存到session中,下一次请求的时候直接在session中重载用户信息。
8) kernel.terminate事件


Symfony里监听kernel.terminate事件的监听器









Symfony2 HttpKernel事件驱动的更多相关文章
- Symfony2源码分析——启动过程2
文章地址:http://www.hcoding.com/?p=46 上一篇分析Symfony2框架源码,探究Symfony2如何完成一个请求的前半部分,前半部分可以理解为Symfony2框架为处理请求 ...
- Symfony2目录结构说明
了解框架的目录结构是框架快速入门的一个途径,一个成熟的框架,每个功能模块都被划分存放在不同的目录. Symfony2一级目录结构: ├── app //这目录下包含了,配置文件(应用的配置文件会被im ...
- symfony2取得web目录绝对路径、相对路径、网址的函数是什么
对于你的需求,Symfony2通过DIC提供了kernel服务,以及request(请求)的封装. 在controller里(在其他地方你可以自行注入kernel,这个服务是HttpKernel库里的 ...
- Symfony2 学习笔记之内部构件
Symfony2内部是怎样工作的以及我们如何来扩展它呢?从外部整体上看,symfony2代码是由许多独立的层构成,每一层都是建立在前一层基础之上.其中,自动加载时不受框架直接管理的,它完全是在Univ ...
- Symfony2 学习笔记之插件格式
一个bundle类似于其它框架中的插件,但是比插件表现更好.它跟其它框架最主要的不同是在Symfony2中所有东西都是bundle,包括核心框架功能和你写的所有应用程序代码.Symfony2中,bun ...
- Symfony2 EventDispatcher组件
一个插件系统中,A插件在不影响其它插件的前提下,添加新的方法,或者在一个方法运行前做一些准备工作,通过继承来实现扩展是很不容易的,由于插件之间的关联关系,A插件的改变也会使得关联的插件 ...
- Symfony2 是什么(转)
本文转自:http://www.cnblogs.com/Seekr/archive/2012/06/15/2550894.html Symfoy2 是什么? PHP世界里又一广受关注的web MVC框 ...
- Symfony2中的设计模式——装饰者模式
装饰者模式的定义 文章链接:http://www.hcoding.com/?p=101 个人站点:http://www.hcoding.com/ 在不必改变原类文件和使用继承的情况下,动态地扩展一个 ...
- 听 Fabien Potencier 谈Symfony2 之 《What is Symfony2 ?》
Symfoy2 是什么? PHP世界里又一广受关注的web MVC框架? Fabien Potencier 却不这么说! Fabien Potencier这样定义Symfoy2 是个什么东西: 首先, ...
随机推荐
- START WITH CONNECT BY PRIOR 链表查询
使用场景:排序 设计思路,id为主键,index为顺序,index存前一个节点的id,当然,按照这个思路可以实现双向链表的(preindex存前一个节点,nextindex存下一个节点) 这样的话排序 ...
- LDMFD和STMFD个人理解
ARM里面的堆栈是满递减(FULL DESCENDING)的.SP指向最后一个入栈的数据,SP的地址由高向低生长.对于LDM和STM指令来说,编号小的寄存器对应堆栈中的低地址. STMFD的寻址方式是 ...
- 转:支撑Github的开源技术
原文来自于:http://www.infoq.com/cn/news/2014/03/projects-power-github Github在3月19号开放了新的项目展示页面(Showcase),S ...
- Android 使用Application总结
Application 配置全局Context 第一步.写一个全局的单例模式的MyApplication继承自Application 覆盖onCreate ,在这个方法里面实例化Application ...
- switchover和failover
Dataguard中primary和standby间的角色切换包括两种:1. switchoverprimary和standby互换角色,一般都是人为的有计划的,主要用于主机或数据库的升级,不会有数据 ...
- Jquery css函数用法(判断标签是否拥有某属性)
判断一个层是否隐藏:$("#id").css("display")=="none" ;在所有匹配的元素中,设置一个样式属性的值:$(&qu ...
- Solr初步学习
Solr采用Lucene搜索库为核心,提供全文索引和搜索开源企业平台,提供REST的HTTP/XML和JSON的API,如果你是Solr新手,那么就和我一起来入门吧!本教程以solr4.8作为测试环境 ...
- svn出现“Previous operation has not finished; run 'cleanup' if it was interrupted”,解决方法
1.首先不需要动svn的服务器端.2.在客户端安装svn的客户端工具,自定义工具中为:command line client tools 安装完之后,在本地目录有svn.exe执行程序3.然后c ...
- linux安装mysql5.1.56
1.编译安装 > groupadd mysql #创建mysql组 > useradd -g mysql mysql #创建用户mysql并添加到mysql组中,这个用户主要是作为mysq ...
- 如何在虚拟机中安装Win7系统
在虚拟机里安装系统,可以很方便我们对系统的各项功能进行测试,而又不会影响本机系统,本节就介绍如何在虚拟机中安装Win7系统 . 工具/原料 vm9虚拟机 电脑一台 方法/步骤 1 在百度上搜索win7 ...
