HttpKernel组件
编辑该页面HttpKernel组件
HttpKernel组件转换提供了一个结构化的过程
请求
成一个响应
利用EventDispatcher组件。它是足够灵活来创建一个完整的框架(Symfony),一个micro-framework(石英玻璃)或一个先进的ob娱乐下载CMS (Drupal)。
安装
1
美元作曲家需要symfony / htob娱乐下载tp-kernel
请注意
如果你安装这个组件之外的Symfony应用程序,你必须要求ob娱乐下载供应商/ autoload.php
文件在你的代码,使作曲家提供的类加载机制。读这篇文章为更多的细节。
请求的工作流程
另请参阅
这篇文章解释了如何使用HttpKernel功能作为一个独立的组件在任何PHP应用程序。在Syob娱乐下载mfony应用程序都已经配置好了,可以使用了。读了控制器和事件和事件监听器文章来了解如何使用它来创建控制器和在Symfony应用程序中定义事件。ob娱乐下载
每个HTTP web交互始于一个请求并以响应。你的工作作为一个开发人员创建PHP代码读取请求信息(如URL)和创建并返回一个响应(例如,一个HTML页面或JSON字符串)。这是一个简化的概述在Symfony请求工作流应用程序:ob娱乐下载
- 的用户要求一个资源在一个浏览器;
- 的浏览器发送一个请求到服务器;
- ob娱乐下载给出了应用程序一个请求对象;
- 的应用程序生成一个响应使用的数据对象请求对象;
- 的服务器发回的响应到浏览器;
- 的浏览器显示了资源到用户。
通常,某种形式的框架或系统用来处理所有重复的任务(如路由、安全等),这样开发人员可以构建页面的应用程序。完全如何这些系统是建立千差万别。HttpKernel组件提供了一个接口的过程,正式开始请求并创建适当的响应。组件是任何应用程序或框架的核心,无论多么不同的体系结构,系统:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
名称空间ob娱乐下载\组件\HttpKernel;使用ob娱乐下载\组件\HttpFoundation\请求;接口HttpKernelInterface{/ /……/ * * *@return响应响应实例* /公共函数处理(请求美元请求,int美元类型= self:: MAIN_REQUEST,保龄球美元抓= true):响应;}
在内部,HttpKernel:处理()的具体实现HttpKernelInterface:处理()——定义了一个工作流,从一开始请求和结束响应。
这个工作流是关键的细节了解内核(和Symfony框架或其他库,使用内核)。ob娱乐下载
HttpKernel:由事件驱动的
的HttpKernel:处理()
方法内部调度事件。这使得该方法灵活,但是也有点抽象,因为所有的“工作”框架/应用程序构建HttpKernel实际上是在事件监听器完成。
有助于解释这一过程,本文着眼于每个步骤的流程和谈判关于一个特定的实现HttpKernel - Symfony框架的工作原理。ob娱乐下载
最初,使用HttpKernel不需要许多步骤。你创建一个事件调度器和一个控制器和参数解析器(下面解释)。内核来完成你的工作,你会增加更多的事件监听器下面讨论的事件:
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
使用ob娱乐下载\组件\EventDispatcher\EventDispatcher;使用ob娱乐下载\组件\HttpFoundation\请求;使用ob娱乐下载\组件\HttpFoundation\RequestStack;使用ob娱乐下载\组件\HttpKernel\控制器\ArgumentResolver;使用ob娱乐下载\组件\HttpKernel\控制器\ControllerResolver;使用ob娱乐下载\组件\HttpKernel\HttpKernel;/ /创建请求对象美元请求=请求::createFromGlobals ();美元调度程序=新EventDispatcher ();/ /……添加一些事件监听器/ /创建控制器和参数解析器美元controllerResolver=新ControllerResolver ();美元argumentResolver=新ArgumentResolver ();/ /实例化内核美元内核=新HttpKernel (美元调度程序,美元controllerResolver,新RequestStack (),美元argumentResolver);/ /实际执行内核,将请求转化为一个响应/ /通过调度事件,调用控制器,并返回响应美元响应=美元内核- >处理(美元请求);/ /发送内容标题和回声美元响应- >send ();/ /触发内核。终止事件美元内核- >终止(美元请求,美元响应);
看到“HttpKernel组件“对于一个更具体的实现。
对于一般信息将侦听器添加到下面的事件,看到的HttpKernel组件。
谨慎
在3.1HttpKernel接受第四个参数,必须的一个实例ArgumentResolverInterface。在4.0这一观点将成为强制性的。
另请参阅
有一个很棒的教程系列使用HttpKernel组件和其他Symfony组件来创建您自己的框架。ob娱乐下载看到介绍。
1)kernel.request
事件
典型的目的:添加更多的信息请求
系统的初始化部分,或返回响应
如果可能的话(如拒绝访问的安全层)。
第一个事件派遣HttpKernel:处理是kernel.request
,这可能有各种不同的听众。
这个事件的侦听器可能千差万别。一些听众,如安全侦听器,可能有足够的信息来创建一个响应
立即对象。例如,如果一个安全侦听器确定用户没有访问,侦听器可能返回RedirectResponse登录页面或403拒绝访问响应。
如果一个响应
返回在此阶段,这个过程直接跳过吗kernel.response事件。
其他听众初始化或添加到请求更多信息。例如,一个侦听器可能确定和设置语言环境请求
对象。
另一个常见的侦听器是路由。一个路由器侦听器可以处理请求
并确定控制器应该呈现(见下一节)。事实上,请求
对象都有一个“属性”包是一个完美的地方储存这些额外的,特定于应用程序的数据请求。这意味着,如果你的路由器侦听器在某种程度上决定了控制器,它可以存储的请求
属性(可以使用控制器解析器)。
总的来说,的目的kernel.request
事件是创建并返回一个响应
直接,或添加信息请求
(如设置语言环境或设置一些其他信息请求
属性)。
请注意
当设置的响应kernel.request
事件,停止传播。这意味着较低的听众优先不会被执行。
2)解决控制器
假设没有kernel.request
侦听器可以创建一个响应
HttpKernel,下一步是确定和准备(即解决)控制器。控制器是end-application代码的一部分,负责创建和返回响应
为一个特定的页面。唯一的要求是,它是一个PHP调用——也就是一个函数,一个对象或一个方法关闭
。
但如何您确定请求的控制器完全取决于您的应用程序。这是“控制器解析器”的工作——一个实现类ControllerResolverInterface的构造函数参数之一HttpKernel
。
你的工作是创建一个类实现接口和填写方法:getController ()
。事实上,一个默认的实现已经存在,您可以直接使用或学习:ControllerResolver。这个实现是在下面的栏中详细解释:
1 2 3 4 5 6 7 8
名称空间ob娱乐下载\组件\HttpKernel\控制器;使用ob娱乐下载\组件\HttpFoundation\请求;接口ControllerResolverInterface{公共函数getController(请求美元请求);}
在内部,HttpKernel:处理()
方法首先调用getController ()在控制器解析器。该方法通过了请求
和负责确定并返回一个PHP调用(控制器)基于请求的信息。
3)kernel.controller
事件
典型的目的:初始化或改变控制器控制器执行之前。
控制器可调用后确定,HttpKernel:处理()
分派kernel.controller
事件。听众这一事件可能会初始化系统的一部分,需要初始化后某些事情已经确定(如控制器,路由信息),但控制器之前执行。
这个事件的另一个典型的用例是检索属性从控制器使用getattribute ()方法。请参阅下面的Syob娱乐下载mfony部分的一些例子。
6.2
的ControllerEvent: getattribute ()
方法是在Symfony 6.2中引入的。ob娱乐下载
听众这个事件也可以改变控制器调用完全通过调用ControllerEvent: setController事件对象,对这一事件的传递给听众。
4)获得控制器参数
接下来,HttpKernel:处理()
调用ArgumentResolverInterface: getArguments ()。记住,控制器中返回getController ()
是一个可调用的。的目的getArguments ()
是返回数组的参数应该传递给控制器。如何这样做是完全取决于你的设计,虽然内置的ArgumentResolver是一个很好的例子。
此时内核有一个PHP调用(控制器)和数组参数,应该通过在执行,可调用的。
5)调用控制器
下一步的HttpKernel:处理()
是执行控制器。
控制器的工作是构建响应给定的资源。这可能是一个HTML页面,一个JSON字符串或其他。与其他过程的一部分,到目前为止,这一步是由“用户”,实现每个页面。
通常,控制器将返回一个响应
对象。如果这是真的,那么内核的工作是完成了!在这种情况下,是下一步kernel.response事件。
但是如果除了控制器返回任何东西响应
,那么内核有一点工作要做kernel.view(因为最终的目标总是生成一个响应
对象)。
请注意
一个控制器必须返回的东西。如果一个控制器返回零
,立即将抛出一个异常。
6)kernel.view
事件
典型的目的:变换一个非-响应
从控制器到一个返回值响应
如果控制器不返回响应
内核对象,然后将另一个事件kernel.view
。这个事件侦听器的工作是使用控制器的返回值(例如数组的数据或对象)来创建一个响应
。
这可能是有用的,如果你想使用一个“视图”层:而不是返回响应
从控制器,你返回的数据代表了页面。一个侦听器,这个事件就可以使用这些数据来创建一个响应
以正确的格式(e。g HTML、JSON、等等)。
在这个阶段,如果没有响应的事件侦听器集,然后抛出异常:要么控制器或的一个监听器必须始终返回一个视图响应
。
请注意
当设置的响应kernel.view
事件,停止传播。这意味着较低的听众优先不会被执行。
7)kernel.response
事件
典型的目的:修改响应
对象就在它发送
内核是变换的最终目标请求
成一个响应
。的响应
可能是在创建的kernel.request事件,返回的控制器,或者返回一个侦听器kernel.view事件。
不管谁创造了响应
另一个事件,kernel.response
之后直接派遣。一个典型的这个事件侦听器将修改响应
对象在某些方面,比如修改标题,添加饼干,甚至改变的内容响应
本身(如注射一些JavaScript结束前< /身体>
标签的HTML响应)。
这个事件派遣后,决赛响应
对象是回来处理()。在最典型的用例,您可以调用send ()方法,该方法把标题和打印响应
内容。
8)kernel.terminate
事件
典型的目的:执行一些“重”行动响应后流给用户
最后HttpKernel过程的事件kernel.terminate
和是独一无二的,因为它发生后的HttpKernel:处理()
方法,在响应发送给用户。记得从上面,然后使用内核的代码,这样结束:
1 2 3 4 5
/ /发送内容标题和回声美元响应- >send ();/ /触发内核。终止事件美元内核- >终止(美元请求,美元响应);
正如您可以看到的,通过调用$内核- >终止
发送响应后,将触发kernel.terminate
事件,您可以在执行某些操作,您可能会延迟为了尽快响应返回给客户端(如发送邮件)。
谨慎
在内部,HttpKernel利用fastcgi_finish_requestPHP函数。这意味着,目前,只有PHP FPM服务器API能够发送响应给客户端,服务器的PHP过程仍然执行一些任务。与所有其他服务器api,听众kernel.terminate
仍在执行,但响应不是发送给客户机,直到他们都完成了。
请注意
使用kernel.terminate
事件是可选的,只能叫做如果你的内核实现TerminableInterface。
处理异常:kernel.exception
事件
典型的目的:处理某种类型的异常和创建一个合适的响应
返回的异常
任何时候如果抛出一个异常HttpKernel:处理()
另一个事件,kernel.exception
是派遣。在内部,身体的处理()
方法是包装在一个try - catch块。任何异常时,kernel.exception
事件分派,这样您的系统能应对异常。
这个事件是通过每个侦听器ExceptionEvent对象,您可以使用它来访问原始异常通过getThrowable ()方法。一个典型的这个事件侦听器将检查一个特定类型的异常并创建一个适当的错误响应
。
例如,生成一个404页的,你可能会抛出一个特殊类型的异常,然后添加一个侦听器在这个事件,寻找这个异常并创建并返回一个404响应
。事实上,HttpKernel组件提供了一个ErrorListener如果选择使用,默认将做到这一点,更多的更多细节(请参阅侧栏下面)。
请注意
当设置的响应kernel.exception
事件,停止传播。这意味着较低的听众优先不会被执行。
创建一个事件监听器
如您所见,您可以创建和事件监听器附加到派遣期间的任何事件HttpKernel:处理()
周期。通常一个侦听器是一个PHP类的方法执行,但它可以是任何东西。在创建和添加事件监听器的更多信息,见EventDispatcher组件。
每个的名字“内核”事件被定义为一个常数KernelEvents类。另外,每个事件监听器传递一个参数,这是一些的子类KernelEvent。这个对象包含关于系统的当前状态信息,每个事件都有自己的事件对象:
的名字 | KernelEvents 常数 |
参数传递给侦听器 |
---|---|---|
kernel.request | KernelEvents:请求 |
RequestEvent |
kernel.controller | KernelEvents:控制器 |
ControllerEvent |
kernel.controller_arguments | KernelEvents: CONTROLLER_ARGUMENTS |
ControllerArgumentsEvent |
kernel.view | KernelEvents:视图 |
ViewEvent |
kernel.response | KernelEvents:响应 |
ResponseEvent |
kernel.finish_request | KernelEvents: FINISH_REQUEST |
FinishRequestEvent |
kernel.terminate | KernelEvents:终止 |
TerminateEvent |
kernel.exception | KernelEvents:异常 |
ExceptionEvent |
一个完整的工作示例
当使用HttpKernel组件,你可以附加任何侦听器的核心事件,使用任何控制器解析器实现ControllerResolverInterface和使用任何参数解析器实现ArgumentResolverInterface。然而,HttpKernel组件提供了一些内置的听众和一切可以用来创建一个工作示例:
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 37 38
使用ob娱乐下载\组件\EventDispatcher\EventDispatcher;使用ob娱乐下载\组件\HttpFoundation\请求;使用ob娱乐下载\组件\HttpFoundation\RequestStack;使用ob娱乐下载\组件\HttpFoundation\响应;使用ob娱乐下载\组件\HttpKernel\控制器\ArgumentResolver;使用ob娱乐下载\组件\HttpKernel\控制器\ControllerResolver;使用ob娱乐下载\组件\HttpKernel\EventListener\RouterListener;使用ob娱乐下载\组件\HttpKernel\HttpKernel;使用ob娱乐下载\组件\路由\匹配器\UrlMatcher;使用ob娱乐下载\组件\路由\RequestContext;使用ob娱乐下载\组件\路由\路线;使用ob娱乐下载\组件\路由\RouteCollection;美元路线=新RouteCollection ();美元路线- >add (“你好”,新路线(“/ hello /{名称}”,(“_controller”= >函数(请求美元请求){返回新响应(sprintf (“你好,% s”,美元请求- >get (“名字”)));}));美元请求=请求::createFromGlobals ();美元匹配器=新UrlMatcher (美元路线,新RequestContext ());美元调度程序=新EventDispatcher ();美元调度程序- >addSubscriber (新RouterListener (美元匹配器,新RequestStack ()));美元controllerResolver=新ControllerResolver ();美元argumentResolver=新ArgumentResolver ();美元内核=新HttpKernel (美元调度程序,美元controllerResolver,新RequestStack (),美元argumentResolver);美元响应=美元内核- >处理(美元请求);美元响应- >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);/ /做一些回应
这将创建一个完整的请求-响应周期,这个新的请求
转换为响应
。内部唯一的区别是,一些听众(如安全性)可能只行动的主要要求。每个侦听器传递的一些子类KernelEvent,他的isMainRequest ()方法可用于检查当前请求是否“主要”或“子”的要求。
例如,一个侦听器,只需要行动的主要请求可能看起来像这样:
1 2 3 4 5 6 7 8 9 10 11
使用ob娱乐下载\组件\HttpKernel\事件\RequestEvent;/ /……公共函数onKernelRequestRequestEvent (美元事件){如果(!美元事件- >isMainRequest ()) {返回;}/ /……}
定位资源
HttpKernel组件负责包机制中使用Symfony应用程序。ob娱乐下载包的关键特性是它们允许覆盖应用程序所使用的任何资源(配置文件、模板、控制器、翻译文件,等等)。
这最重要的机制,因为资源引用而不是它们的物理路径的逻辑路径。例如,services . xml
文件存储在资源/ config /
一捆的目录称为FooBundle引用@FooBundle /资源/配置/ services . xml
。这个逻辑路径将工作当应用程序覆盖该文件,甚至如果你改变FooBundle的目录。
HttpKernel组件提供了一个方法调用locateResource ()可用于逻辑路径转换成物理路径:
1
美元路径=美元内核- >locateResource (“@FooBundle /资源/配置/ services . xml”);