HttpKernel组件
编辑该页面警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 2.4,不再维护。
读这个页面的更新版本Symfob娱乐下载ony 6.3(当前的稳定版本)。
HttpKernel组件
HttpKernel组件转换提供了一个结构化的过程
请求
成一个响应
利用EventDispatcher。它是足够灵活来创建一个完整的框架(Symfony),一个micro-framework(石英玻璃)或一个先进的ob娱乐下载CMS系统(Drupal)。
安装
您可以安装组件在两个不同的方面:
- 安装它通过作曲家(
ob娱乐下载symfony / http-kernel
在Packagist); - 使用官方的Git存储库(https://github.com/ob娱乐下载symfony/HttpKernel)。
请求的工作流程
每个HTTP web交互始于一个请求并以响应。你的工作作为一个开发人员创建PHP代码读取请求信息(如URL)和创建并返回一个响应(例如,一个HTML页面或JSON字符串)。
通常,某种形式的框架或系统用来处理所有重复的任务(如路由、安全等),这样开发人员可以轻松地构建页面的应用程序。完全如何这些系统是建立千差万别。HttpKernel组件提供了一个接口的过程,正式开始请求并创建适当的响应。组件是任何应用程序或框架的核心,无论多么不同的体系结构,系统:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
名称空间ob娱乐下载\组件\HttpKernel;使用ob娱乐下载\组件\HttpFoundation\请求;接口HttpKernelInterface{/ /……/ * * *@return响应响应实例* /公共函数处理(请求美元请求,美元类型= self:: MASTER_REQUEST,美元抓= true);}
在内部,HttpKernel:处理()的具体实现HttpKernelInterface:处理()——定义了一个工作流,从一开始请求和结束响应。
这个工作流是关键的细节了解内核(和Symfony框架或其他库,使用内核)。ob娱乐下载
HttpKernel:由事件驱动的
的HttpKernel:处理()
方法内部调度事件。这使得该方法灵活,但是也有点抽象,因为所有的“工作”框架/应用程序构建HttpKernel实际上是在事件监听器完成。
有助于解释这一过程,本文着眼于每个步骤的流程和谈判关于一个特定的实现HttpKernel - Symfony框架的工作原理。ob娱乐下载
最初,使用HttpKernel很简单,包括创建一个EventDispatcher和一个控制器解析器(下面解释)。内核来完成你的工作,你会增加更多的事件监听器下面讨论的事件:
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
使用ob娱乐下载\组件\HttpFoundation\请求;使用ob娱乐下载\组件\HttpKernel\HttpKernel;使用ob娱乐下载\组件\EventDispatcher\EventDispatcher;使用ob娱乐下载\组件\HttpKernel\控制器\ControllerResolver;/ /创建请求对象美元请求=请求::createFromGlobals ();美元调度程序=新EventDispatcher ();/ /……添加一些事件监听器/ /创建控制器解析器美元解析器=新ControllerResolver ();/ /实例化内核美元内核=新HttpKernel (美元调度程序,美元解析器);/ /实际执行内核,将请求转化为一个响应/ /通过调度事件,调用控制器,并返回响应美元响应=美元内核- >处理(美元请求);/ /发送内容标题和回声美元响应- >send ();/ /触发内核。终止事件美元内核- >终止(美元请求,美元响应);
看到“HttpKernel组件“对于一个更具体的实现。
对于一般信息将侦听器添加到下面的事件,看到的HttpKernel组件。
提示
法效力还写了精彩的系列使用HttpKernel组件和其他Symfony组件来创建您自己的框架。ob娱乐下载看到创建您自己的框架……在Symfony2组件ob娱乐下载。
1)kernel.request
事件
典型的目的:添加更多的信息请求
系统的初始化部分,或返回响应
如果可能的话(如拒绝访问的安全层)。
第一个事件派遣HttpKernel:处理是kernel.request
,这可能有各种不同的听众。
这个事件的侦听器可能千差万别。一些听众,如安全侦听器,可能有足够的信息来创建一个响应
立即对象。例如,如果一个安全侦听器确定用户没有访问,侦听器可能返回RedirectResponse登录页面或403拒绝访问响应。
如果一个响应
返回在此阶段,这个过程直接跳过吗kernel.response事件。
其他听众仅仅初始化或添加到请求更多信息。例如,一个侦听器可能确定和设置语言环境请求
对象。
另一个常见的侦听器是路由。一个路由器侦听器可以处理请求
并确定控制器应该呈现(见下一节)。事实上,请求
对象都有一个“属性”包是一个完美的地方储存这些额外的,特定于应用程序的数据请求。这意味着,如果你的路由器侦听器在某种程度上决定了控制器,它可以存储的请求
属性(可以使用控制器解析器)。
总的来说,的目的kernel.request
事件是创建并返回一个响应
直接,或添加信息请求
(如设置语言环境或设置一些其他信息请求
属性)。
kernel.request
在Symfonob娱乐下载y框架
最重要的侦听器kernel.request
在Symfonob娱乐下载y框架RouterListener。这类执行路由层,它返回一个数组关于匹配请求的信息,包括_controller
和任何占位符路线的模式(如。{蛞蝓}
)。看到路由组件。
这个数组的信息存储请求对象的属性
数组中。添加路由信息还不做任何事,但下当解决控制器使用。
2)解决控制器
假设没有kernel.request
侦听器可以创建一个响应
HttpKernel,下一步是确定和准备(即解决)控制器。控制器是end-application代码的一部分,负责创建和返回响应
为一个特定的页面。唯一的要求是,它是一个PHP调用——也就是一个函数,方法一个对象,或一个关闭
。
但如何您确定请求的控制器完全取决于您的应用程序。这是“控制器解析器”的工作——一个实现类ControllerResolverInterface的构造函数参数之一HttpKernel
。
你的工作是创建一个类,实现接口,并填写它的两种方法:getController
和getArguments
。事实上,一个默认的实现已经存在,您可以直接使用或学习:ControllerResolver。这个实现是在下面的栏中详细解释:
1 2 3 4 5 6 7 8 9 10
名称空间ob娱乐下载\组件\HttpKernel\控制器;使用ob娱乐下载\组件\HttpFoundation\请求;接口ControllerResolverInterface{公共函数getController(请求美元请求);公共函数getArguments(请求美元请求,美元控制器);}
在内部,HttpKernel:处理
方法首先调用getController ()在控制器解析器。该方法通过了请求
和负责确定并返回一个PHP调用(控制器)基于请求的信息。
第二种方法,getArguments ()后,将调用另一个事件kernel.controller
派遣。
解决控制器在Symfony框架ob娱乐下载
Symfob娱乐下载ony框架使用内置的ControllerResolver类(实际上,它使用一个子类与一些额外的功能下面提到)。这类放置在利用信息请求
对象的属性
地产在RouterListener
。
getController
的ControllerResolver
寻找一个_controller
关键在请求
对象的属性属性(回想一下,这些信息通常放在请求
通过RouterListener
)。然后这个字符串转换成一个PHP调用通过以下几点:
-
一个)
AcmeDemoBundle:默认值:索引
的格式_controller
关键 -
更改为另一个字符串,其中包含完整的类和方法名称中使用的控制器按照惯例Symfony——如。ob娱乐下载
Acme \ DemoBundle \控制器\ DefaultController: indexAction
。这种转变是特定的ControllerResolver子类使用Symfony框架。ob娱乐下载 - b)控制器的一个新实例类被实例化无
- 构造函数参数。
- 如果控制器实现ContainerAwareInterface,
-
setContainer
是呼吁控制器对象并传递给它的容器。这一步也是具体的ControllerResolver子类使用Symfony框架。ob娱乐下载也有一些其他的变化,过程(例如,如果你注册你的控制器作为服务)。
3)kernel.controller
事件
典型的目的:初始化或改变控制器控制器执行之前。
控制器可调用后确定,HttpKernel:处理
分派kernel.controller
事件。听众这一事件可能会初始化系统的一部分,需要初始化后某些事情已经确定(如控制器,路由信息),但控制器之前执行。一些示例,请参阅下面的Symfony部分。ob娱乐下载
听众这个事件也可以改变控制器调用完全通过调用FilterControllerEvent: setController事件对象,对这一事件的传递给听众。
kernel.controller
在Symfonob娱乐下载y框架
有一些小的听众kernel.controller
事件在Symfony框架,ob娱乐下载许多处理收集分析器数据分析器时启用。
一个有趣的侦听器来自SensioFrameworkExtraBundle, Symfony标准版的包装。ob娱乐下载这个监听器@ParamConverter
功能允许您通过一个完整的对象(例如帖子
对象)控制器,而不是一个标量值(例如一个id
参数是你的路线)。侦听器,ParamConverterListener
——使用反射来看看每个控制器的参数,并试图用不同的方法将这些对象,然后存储在属性
财产的请求
对象。阅读下一节看到为什么这很重要。
4)获得控制器参数
接下来,HttpKernel:处理
调用getArguments ()。记住,控制器中返回getController
是一个可调用的。的目的getArguments
是返回数组的参数应该传递给控制器。如何这样做是完全取决于你的设计,虽然内置的ControllerResolver是一个很好的例子。
此时内核有一个PHP调用(控制器)和数组参数,应该通过在执行,可调用的。
5)调用控制器
下一步很简单!HttpKernel:处理
执行控制器。
控制器的工作是构建响应给定的资源。这可能是一个HTML页面,一个JSON字符串或其他。与其他过程的一部分,到目前为止,这一步是由“用户”,实现每个页面。
通常,控制器将返回一个响应
对象。如果这是真的,那么内核的工作是完成了!在这种情况下,是下一步kernel.response事件。
但是如果除了控制器返回任何东西响应
,那么内核有一点工作要做kernel.view(因为最终的目标总是生成一个响应
对象)。
请注意
一个控制器必须返回的东西。如果一个控制器返回零
,立即将抛出一个异常。
6)kernel.view
事件
典型的目的:变换一个非-响应
从控制器到一个返回值响应
如果控制器不返回响应
内核对象,然后将另一个事件kernel.view
。这个事件侦听器的工作是使用控制器的返回值(例如数组的数据或对象)来创建一个响应
。
这可能是有用的,如果你想使用一个“视图”层:而不是返回响应
从控制器,你返回的数据代表了页面。一个侦听器,这个事件就可以使用这些数据来创建一个响应
以正确的格式(e。g HTML、JSON、等等)。
在这个阶段,如果没有响应的事件侦听器集,然后抛出异常:要么控制器或的一个监听器必须始终返回一个视图响应
。
kernel.view
在Symfonob娱乐下载y框架
没有默认侦听器在Symfony框架ob娱乐下载kernel.view
事件。然而,一个核心包- SensioFrameworkExtraBundle做一个侦听器添加到这个事件。如果你的控制器返回一个数组,而你的地方@Template
注释上面控制器,然后该侦听器显示一个模板,将你从控制器返回的数组传递给模板,并创建一个响应
从模板中包含返回的内容。
此外,一个受欢迎的社区包欧宝体育平台怎么样FOSRestBundle旨在实现一个侦听器在这个事件给你一个健壮的视图层能够使用一个控制器返回许多不同内容类型的反应(如HTML、JSON、XML等)。
7)kernel.response
事件
典型的目的:修改响应
对象就在它发送
内核是变换的最终目标请求
成一个响应
。的响应
可能是在创建的kernel.request事件,返回的控制器,或者返回一个侦听器kernel.view事件。
不管谁创造了响应
另一个事件,kernel.response
之后直接派遣。一个典型的这个事件侦听器将修改响应
对象在某些方面,比如修改标题,添加饼干,甚至改变的内容响应
本身(如注射一些JavaScript结束前< /身体>
标签的HTML响应)。
这个事件派遣后,决赛响应
对象是回来处理()。在最典型的用例,您可以调用send ()方法,该方法把标题和打印响应
内容。
kernel.response
在Symfonob娱乐下载y框架
有几个小听众对这个事件在Symfony框架,和大多数修改响应。ob娱乐下载例如,WebDebugToolbarListener注入一些JavaScript在页面的底部dev
环境导致web调试工具栏显示。另一个侦听器,ContextListener序列化当前用户的信息输入到会话,这样就可以将加载下一个请求。
8)kernel.terminate
事件
典型的目的:执行一些“重”行动响应后流给用户
最后HttpKernel过程的事件kernel.terminate
和是独一无二的,因为它发生后的HttpKernel:处理
方法,在响应发送给用户。记得从上面,然后使用内核的代码,这样结束:
1 2 3 4 5
/ /发送内容标题和回声美元响应- >send ();/ /触发内核。终止事件美元内核- >终止(美元请求,美元响应);
正如您可以看到的,通过调用$内核- >终止
发送响应后,将触发kernel.terminate
事件,您可以在执行某些操作,您可能会延迟为了尽快响应返回给客户端(如发送邮件)。
请注意
使用kernel.terminate
事件是可选的,只能叫做如果你的内核实现TerminableInterface。
kernel.terminate
在Symfonob娱乐下载y框架
如果你使用Symfony的SwiftmailerBundle和使用ob娱乐下载内存
假脱机,EmailSenderListener被激活,实际上交付期间您将发送的任何电子邮件请求。
处理异常:kernel.exception
事件
典型的目的:处理某种类型的异常和创建一个合适的响应
返回的异常
任何时候如果抛出一个异常HttpKernel:处理
另一个事件,kernel.exception
抛出。在内部,身体的处理
函数是包装在一个try - catch块。任何异常时,kernel.exception
事件分派,这样您的系统能应对异常。
这个事件是通过每个侦听器GetResponseForExceptionEvent对象,您可以使用它来访问原始异常通过getException ()方法。一个典型的这个事件侦听器将检查一个特定类型的异常并创建一个适当的错误响应
。
例如,生成一个404页的,你可能会抛出一个特殊类型的异常,然后添加一个侦听器在这个事件,寻找这个异常并创建并返回一个404响应
。事实上,HttpKernel组件提供了一个ExceptionListener如果选择使用,默认将做到这一点,更多的更多细节(请参阅侧栏下面)。
kernel.exception
在Symfonob娱乐下载y框架
有两个主要的听众kernel.exception
当使用Symfony框架。ob娱乐下载
在HttpKernel ExceptionListener
第一个核心HttpKernel组件,叫做ExceptionListener。侦听器有几个目标:
- 抛出的异常转换为FlattenException对象,它包含所有请求的信息,但可以打印和序列化。
- 如果原始异常实现HttpExceptionInterface,然后
getStatusCode
和getHeaders
被称为异常和用于填充的标题和状态码FlattenException
对象。这个想法是这些用于下一步在创建最终的响应。 - 执行一个控制器,通过扁平的例外。具体的控制器呈现作为构造函数参数传递给侦听器。该控制器将返回最后一个
响应
对于这个错误页面。
ExceptionListener安全
其他重要的侦听器是ExceptionListener。此侦听器的目的是处理安全异常,在适当的时候,帮助用户进行身份验证(例如重定向到登录页面)。
创建一个事件监听器
如您所见,您可以创建和事件监听器附加到派遣期间的任何事件HttpKernel:处理
周期。通常一个侦听器是一个PHP类的方法执行,但它可以是任何东西。在创建和添加事件监听器的更多信息,见EventDispatcher组件。
每个的名字“内核”事件被定义为一个常数KernelEvents类。另外,每个事件监听器传递一个参数,这是一些子类KernelEvent。这个对象包含关于系统的当前状态信息,每个事件都有自己的事件对象:
的名字 | KernelEvents 常数 |
参数传递给侦听器 |
---|---|---|
kernel.request | KernelEvents:请求 |
GetResponseEvent |
kernel.controller | KernelEvents:控制器 |
FilterControllerEvent |
kernel.view | KernelEvents:视图 |
GetResponseForControllerResultEvent |
kernel.response | KernelEvents:响应 |
FilterResponseEvent |
kernel.finish_request | KernelEvents: FINISH_REQUEST |
FinishRequestEvent |
kernel.terminate | KernelEvents:终止 |
PostResponseEvent |
kernel.exception | KernelEvents:异常 |
GetResponseForExceptionEvent |
一个完整的工作示例
当使用HttpKernel组件,你可以附加任何听众的核心事件和使用任何控制器解析器实现ControllerResolverInterface。然而,HttpKernel组件提供了一些内置的听众和一个内置的ControllerResolver可以用来创建一个工作示例:
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
使用ob娱乐下载\组件\HttpFoundation\请求;使用ob娱乐下载\组件\HttpFoundation\响应;使用ob娱乐下载\组件\HttpKernel\HttpKernel;使用ob娱乐下载\组件\EventDispatcher\EventDispatcher;使用ob娱乐下载\组件\HttpKernel\控制器\ControllerResolver;使用ob娱乐下载\组件\HttpKernel\EventListener\RouterListener;使用ob娱乐下载\组件\路由\RouteCollection;使用ob娱乐下载\组件\路由\路线;使用ob娱乐下载\组件\路由\匹配器\UrlMatcher;使用ob娱乐下载\组件\路由\RequestContext;美元路线=新RouteCollection ();美元路线- >add (“你好”,新路线(“/ hello /{名称}”,数组(“_controller”= >函数(请求美元请求){返回新响应(sprintf (“你好,% s”,美元请求- >get (“名字”)));}));美元请求=请求::createFromGlobals ();美元匹配器=新UrlMatcher (美元路线,新RequestContext ());美元调度程序=新EventDispatcher ();美元调度程序- >addSubscriber (新RouterListener (美元匹配器));美元解析器=新ControllerResolver ();美元内核=新HttpKernel (美元调度程序,美元解析器);美元响应=美元内核- >处理(美元请求);美元响应- >send ();美元内核- >终止(美元请求,美元响应);
子请求
除了“主要”请求发送到HttpKernel:处理
所谓“子请求”,您还可以发送。子请求看起来,就像任何其他的请求,但通常是呈现一个页面的一小部分,而不是一个完整的页面。你最常使子请求,从你的控制器(或者从一个模板中,呈现在你的控制器)。
执行子请求,使用HttpKernel:处理
,但改变第二个参数如下:
1 2 3 4 5 6 7 8 9 10 11 12
使用ob娱乐下载\组件\HttpFoundation\请求;使用ob娱乐下载\组件\HttpKernel\HttpKernelInterface;/ /……/ /根据需要手动创建其他请求美元请求=新请求();/ /例如,手动设置其_controller美元请求- >属性- >集(“_controller”,“……”);美元响应=美元内核- >处理(美元请求,HttpKernelInterface::SUB_REQUEST);/ /做一些回应
2.4
的isMasterRequest ()
方法是在Symfony 2.4中引入的。ob娱乐下载之前,getRequestType ()
必须使用方法。
这将创建一个完整的请求-响应周期,这个新的请求
转换为响应
。内部唯一的区别是,一些听众(如安全性)可能只行动主请求。每个侦听器传递的一些子类KernelEvent,他的isMasterRequest ()可以用来检查当前请求是否“主”或“子”的要求。
例如,一个侦听器,只需要按照主请求可能看起来像这样:
1 2 3 4 5 6 7 8 9 10 11
使用ob娱乐下载\组件\HttpKernel\HttpKernelInterface;/ /……公共函数onKernelRequest(GetResponseEvent美元事件){如果(!美元事件- >isMasterRequest ()) {返回;}/ /……}