Heim > php教程 > php手册 > Symfoy2 HttpKernel事件驱动,symfoy2httpkernel

Symfoy2 HttpKernel事件驱动,symfoy2httpkernel

WBOY
Freigeben: 2016-06-13 09:23:20
Original
902 Leute haben es durchsucht

Symfoy2 HttpKernel事件驱动,symfoy2httpkernel

HttpKernel:事件驱动       Symfony2 框架层和应用层的工作都是在 HttpKernel::handle()方法中完成,HttpKernel::handle() 的内部的实现其实是通过调度事件(HttpKernel内的事件监听器)来完成的,相当于把所有组件都整合成完整的应用。           使用 HttpKernel 很简单,只需要创建一个 EventDispatcher(事件分发器)  controller resolver(Controller解析器),可以实现更多的事件监听器丰富应用的功能:  kernel.request Event         实现kernel.request事件目的是为了添加更多信息到Request对象,或者得到返回的Response对象(例如:从缓存中获取又或者security层拒绝访问)         kernel.request事件是HttpKernel::handle()调度的第一个事件,那么监听该事件的多个监听器就会被执行。 事件的监听器多种多样,它们的行为各不相同,例如security监听器判断用户没有足够的权限的时候一个RedirectResponse对象,如果当前直接返回Response对象,那么就会直接执行 kernel.response 事件: 事件的目的要么就是直接创建和返回Response对象,要么就是添加更多的信息到Request对象。  

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

Nach dem Login kopieren

2) Resolve the Controller

假设实现kernel.request事件的时候没有创建和返回Response对象,那么下一步就是确定、解析controller和controller需要的参数。controller部分是应用层的最后一个堡垒,负责创建和返回包含一个特定页面的Response对象。如何确定被请求的controller完全取决于应用程序,这个工作有controller解析器来完成——一个是实现ControllerResolverInterface的类,同时也是HttpKernel构造函数的一个参数。 首先调用controller resolver 的 getController()方法,并向该方法传入Request对象,controller resolver根据Request包含的信息确定并返回controller。 第二个方法,getArguments()会在kernel.controller事件被调度的时候执行。

<span><em>解析Controller</em></span>
<span><em>Symfony框架使用内置的ControllerResolver(实质上是使用了一个有额外的功能的子类),该解析器利用了RouterListener保存到Request对象的attributes属性里信息来确定controller。</em></span>
<span><em> </em></span>
<span><em>getController</em></span>
<em>ControllerResolver </em><em>在Request对象的attributes数组中</em><em>查找 _controller 键(这些信息实际上是由RouterListener存放进Request对象中的):</em>
<em> </em>
<em>a) 如果</em><em><span><span>_controller 键对应</span></span></em><em><span>AcmeDemoBundle:Default:index 这个格式的值,那么该值就包含了类名和方法名,可以被Symfony框架解析成为,例如:</span></em><em><span>Acme\DemoBundle\Controller\DefaultController::indexAction,这个转换是由Symfony框架的特定的</span></em><em>ControllerResolver的子类完成的。</em>
<em> </em>
<em>b) 你的controller类会被实例化,而且该controller类必须包含一个无参的构造函数。</em>
<em> </em>
<span><em>c) 如果你的controller还实现了ContainerAwareInterface,那么setContainer方法就会被调用,container就会被注入到controller中,</em></span><em><span>这个实现也是由Symfony框架的特定的</span></em><em>ControllerResolver的子类完成的。</em>
<em> </em>




<em><span>上面也有一些其他变化过程,例如你把你的controller配置成为service。</span></em>
<em><span> </span></em>
<em>      </em>





Nach dem Login kopieren

3) The <code><span>kernel.controller</span> Event

kernel.controller事件是在controller被执行前初始化一些信息或者改变controller对象。


被调用的controller确定之后,HttpKernel::handle()就会调度kernel.controller事件。在系统的某部分被确定后(例如:controller、路由信息等)但是这些部分被执行前,监听kernel.controller事件的监听器就会运行了。

4)获得controller的参数 getAttributes()方法是返回一个参数数组,这个参数数组会被传递给controller,我们也可以自定义该方法,也可以使用Symfony框架内置的。 ControllerResolver使用放射机制获得被调用的controller的方法的参数列表。遍历该列表,使用下面的步骤来确定参数列表中一一对应的值:
<code><code><span> </span></code></code>
Nach dem Login kopieren
<span><em>a) 使用参数作为键查找Request对象中的attributes数组,如果找到,那么相应的值会传入到controller的方法中,例如:controller方法的第一个参数是$name,那么在Request的attributes数组中包含$</em></span><em>attributes['name']的值,那么</em><span><em>$</em></span><em>attributes['name']就会被使用。</em>
Nach dem Login kopieren
<em> </em>
Nach dem Login kopieren
Nach dem Login kopieren
<em>b) 如果该该参数在Symfony配置routing的时候被指定,那么就会跳过对该参数的查找。</em>
Nach dem Login kopieren
<em> </em>
Nach dem Login kopieren
Nach dem Login kopieren

5)调用controller

这一步,controller就会被执行。 controller会创建包含特定页面或者json的Response对象,这也是应用层的最后一个步骤。 <em> </em> Symfony框架中没有缺省的监听器实现kernel.view事件,可是,有一个核心Bundle——SensioFrameworkExtraBundle里有个监听改事件的监听器。如果你的controller返回一个数组,并且在controller类的顶部有@Template的注解,那么该监听器就会渲染一个模板,把controller返回的数组传入到模板中,最后利用模板返回的内容创建一个Response对象,并返回该Response对象。 <em> </em> 除此之外,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). <em> </em> <em> </em> 7) kernel.response 事件 在发送Response对象到客户端前修改它。 kernel的目的是把Request对象转换成为Response对象。Response对象可能是在kernel.request事件中创建,可能是由controller返回,又或者是由监听kernel.view事件的监听器返回。 不管是在哪一个环节创建Response对象,最后kernel.response事件都会被触发。监听kernel.response事件的监听器都会以某种方式修改Response对象,例如:修改Response的header部分,修改cookie,或者甚至会修改Response对象返回的内容(注入javascript到标签前等等) kernel.response事件完成后,HttpKernel::handle()返回最终的Response对象,调用Response::send()箱客户端发送headers头部和Response实体。
Symfony框架实现kernel.response事件
<em> </em>
Symfony框架内置几个监听器监听kernel.response事件,更多的可以通过开发者社区获得。例如:在dev开发环境下WebDebugToolbarListener向页面的底部注入javascript代码,debug工具条就会显示出来。还有另一个监听器,ContextListener序列化当前用户的信息保存到session中,下一次请求的时候直接在session中重载用户信息。

Nach dem Login kopieren
   

        8) kernel.terminate事件

      监听该事件的监听器通常都是处理一些耗时的后台程序。           HttpKernel进程的最后一个事件是kernel.terminate事件,而且该事件的触发是在HttpKernel::handle()方法之后,并且响应的内容已经发送给用户。  Symfony框架一个完整的工作流程           使用HttpKernel组件的时候,我们不需要实现任何监听器添加到内核事件中,也不需要实现controller resolver。HTTp组件自带的监听器和controller resolver就能够正常工作了:   子请求           除了把“main request”传入到HttpKernel::handle之外,还可以把所谓的“sub request”传入HttpKernel::handle中。子请求看起来和其它的请求差不多,不同的是,一般的请求是渲染完整的一个页面,而子请求渲染的是一个页面的一部分。通常我们都是在controller里面创建一个子请求(或者在模板里面创建)。           HttpKernel::handle方法运行子请求的时候,需要修改第二个参数的值:         子请求也是创建一个完整的请求——响应周期。唯一不同的是,有些监听器可能只会在“main request”中运行(security)。KernelEvent的子类传递给监听器,监听器通过KernelEvent::getRequestType()判断当前请求是“main request”还是“sub request”。         例如一个监听器只会在“main request”的请求下才会执行:  

 

linux24 and linux26 的kernel有什不同?大概是加了一些驱动?里面有所有硬件的驱动?例如USB

你不知道这些不是你的错,你错就错在总是想等别人给你端现成的。自己去寻找答案吧!~慢慢找 这样你才能成长。别再浪费时间提这些毫无意义的问题了。
 

联想G450,新装了win81,驱动用驱动人生装的,经常出现自动重启的现象,查看一下事件是kernel-power

尊敬的联想用户您好!
这是本身文件缺失或不完整或者是和其他软件冲突造成的。
建议您到官网下载显卡驱动,链接:
support1.lenovo.com.cn/lenovo/wsi/Modules/Drive.aspx
建议您在卸载前先到控制面板-设备管理器处卸载对应的驱动,然后开机按F8进入安全模式进行安装。
无效可以尝试win+r,输入msconfig,关闭启动项来排查冲突的软件程序。
或者是输入cmd,命令提示符下输入sfc/scannow修复系统文件。
问题仍得不到解决,建议您重装系统。
更多问题您可以咨询
idea论坛:lenovobbs.lenovo.com.cn/...ureply
Think论坛:thinkbbs.lenovo.com.cn/...ureply
联想乐社区:bbs.lenovomobile.com/...ureply
期待您满意的评价,感谢您对联想的支持,祝您生活愉快!
联想企业平台 [官方认证]

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Empfehlungen
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage