书籍Symfony 5:快速轨道欧宝娱乐app下载地址

欧宝娱乐app下载地址Symfony 5:快速轨道是学习现代Symfony开发的最好的书,从零到生产。欧宝娱乐app下载地址+300页展示Symfony与Docker,欧宝娱乐app下载地址 api,队列和异步任务,Webpack, spa等。

HttpKernel组件

HttpKernel组件

HttpKernel组件提供了一个结构化的过程来转换要求进入A.回复通过使用EventDispatcher组件。它非常灵活,可以创建全栈框架(Symfony)、微框架(Silex)或高级CMS系统(Drupal)。欧宝娱乐app下载地址

安装

1
作曲家需要symfony / ht欧宝娱乐app下载地址tp-kernel

请注意

如果在Symfony应用程序之外安装此组件,则必须使用欧宝娱乐app下载地址供应商/ autoload.php文件,以启用Composer提供的类自动加载机制。读本文为更多的细节。

请求的工作流

另请参阅

本文解释如何在任何PHP应用程序中将HttpKernel特性作为独立组件使用。在Sy欧宝娱乐app下载地址mfony应用程序中,所有东西都已经配置好了,可以使用了。读了控制器事件和事件监听器文章了解如何使用它在Symfony应用程序中创建控制器和定义事件。欧宝娱乐app下载地址

每个HTTP Web交互都以请求开始,并以响应结尾。您作为开发人员的工作是创建读取请求信息(例如URL)的PHP代码并创建并返回响应(例如,HTML页面或JSON字符串)。这是Symfony应用程序中请求工作流程的简化概述:欧宝娱乐app下载地址

  1. 用户询问A.资源在一个浏览器
  2. 浏览器发送一个要求服务器
  3. 欧宝娱乐app下载地址给出了应用一个要求目的;
  4. 应用生成A.回复对象的数据要求目的;
  5. 服务器发回的回复浏览器
  6. 浏览器显示了资源用户

通常,构建某种框架或系统以处理所有重复任务(例如路由,安全性等),以便开发人员可以构建申请。确切地如何这些系统的构建差异很大。HttpKernel组件提供了一个接口,该接口将从请求开始并创建适当的响应的过程形式化。组件是任何应用程序或框架的核心,无论该系统的架构如何变化:

命名空间欧宝娱乐app下载地址symfony \ component \ httpkernel采用欧宝娱乐app下载地址Symfony \ HttpFoundation \ \组件请求接口httpkernelinterface./ /……/ *** @return Response响应实例*/民众功能处理要求美元的请求美元的类型自我::MASTER_REQUESTBOOL.$ catch.真的);

在内部,httpkernel :: change()——具体实施httpkernelinterface :: change()- 定义以开头的工作流程欧宝娱乐app下载地址Symfony \ HttpFoundation \ \组件请求结束了欧宝娱乐app下载地址Symfony \ HttpFoundation \ \组件响应

此工作流的确切详细信息是了解内核(以及Symfony Framework或使用内核)的任何其他库的关键。欧宝娱乐app下载地址

HttpKernel:由事件驱动

httpkernel :: change()方法通过调度事件在内部工作。这使得该方法都是灵活的,而且有点摘要,因为使用HttpKernel建立的框架/应用程序的所有“工作”实际上是在事件侦听器中完成的。

为了帮助解释这个过程,本文档查看了这个过程的每个步骤,并讨论了HttpKernel的一个特定实现——Symfony框架——是如何工作的。欧宝娱乐app下载地址

最初,使用欧宝娱乐app下载地址Symfony \ \ HttpKernel \ HttpKernel组件不需要很多步骤。你创建一个事件调度器A.控制器和参数解析器(下面解释)。为了完成你的内核工作,你需要在下面讨论的事件中添加更多的事件监听器:

采用欧宝娱乐app下载地址symfony \ component \ enceDispatcher \ enceDispatcher采用欧宝娱乐app下载地址Symfony \ HttpFoundation \ \组件请求采用欧宝娱乐app下载地址Symfony \ \ HttpFoundation \ RequestStack组件采用欧宝娱乐app下载地址Symfony \组件\ HttpKernel \ \ ArgumentResolver控制器采用欧宝娱乐app下载地址symfony \ component \ httpkernel \ controller \ controlyerresolver采用欧宝娱乐app下载地址Symfony \ \ HttpKernel \ HttpKernel组件//创建Request对象美元的请求要求::createFromGlobals();$调度员新的EventDispatcher.();/ /……添加一些事件监听器//创建您的控制器和参数solarvers$ ControlyResolver.新的ControllerResolver();$ ArgumentResolver新的ArgumentResolver();//实例化内核$内核新的HttpKernel$调度员$ ControlyResolver.新的RequestStack(),$ ArgumentResolver);//实际上执行内核,将请求转换为响应//通过调度事件,调用控制器,并返回响应美元的反应$内核- >处理美元的请求);//发送标题并回声内容美元的反应- >发送();//触发kernel.terminate事件$内核- >终止美元的请求美元的反应);

看 ”完整的工作示例“对于更具体的实施。

有关将监听器添加到下面事件的一般信息,请参见创建事件监听器

谨慎

截至3.1欧宝娱乐app下载地址Symfony \ \ HttpKernel \ HttpKernel组件接受第四个参数,它必须是的实例欧宝娱乐app下载地址symfony \ component \ httpkernel \ controller \ ArgumentResolverInterface.在4.0中,这个论点将成为强制性的。

另请参阅

有一个关于使用HttpKernel组件和其他Symfony组件创建您自己的框架的精彩教程系列。欧宝娱乐app下载地址看到介绍

1)kernel.request.事件

典型的目的:添加更多的信息到要求,初始化系统的部分,或返回a回复如果可能的话(例如,拒绝访问的安全层)。

内核活动信息表

在内部分派的第一个事件HttpKernel:处理kernel.request.,它可能有各种不同的听众。

这个活动的听众各不相同。一些侦听器——例如安全侦听器——可能有足够的信息来创建回复立即对象。例如,如果安全侦听器确定用户没有访问权限,则该侦听器可能返回欧宝娱乐app下载地址Symfony \ \ HttpFoundation \ RedirectResponse组件或出现403 Access Denied响应。

如果一个回复在此阶段返回时,进程直接跳到kernel.response.事件。

其他侦听器对请求进行初始化或添加更多信息。例如,侦听器可以在要求对象。

另一个常见的侦听器是路由。路由器监听器可以处理要求并确定应呈现的控制器(请参阅下一节)。事实上,要求对象有一个“属性“袋子是一个完美的现货,用于存储有关该请求的额外应用程序特定数据。这意味着如果您的路由器侦听器以某种方式确定控制器,它可以将其存储在要求属性(可以由控制器解析器使用)。

总的来说,目的是kernel.request.事件是创建并返回回复直接,或添加信息到要求(例如设置区域设置或在要求属性)。

请注意

的响应kernel.request.事件,停止传播。这意味着未执行较低优先级的侦听器。

2)解析控制器

假设没有kernel.request.听众能够创造一个回复, HttpKernel的下一步是确定和准备(即解析)控制器。控制器是终端应用程序代码的一部分,它负责创建和返回回复对于特定页面。唯一的要求是它是一个php可调用 - 即一个函数,对象上的方法或a关闭

如何确定请求的确切控制器完全取决于应用程序。这是“控制器解析器”的工作——一个实现的类欧宝娱乐app下载地址Symfony \组件\ HttpKernel \ \ ControllerResolverInterface控制器并且是构造函数参数之一HttpKernel

你的工作是创建一个实现接口的类,并填充它的方法:getController ().事实上,一个默认实现已经存在,你可以直接使用或学习:欧宝娱乐app下载地址symfony \ component \ httpkernel \ controller \ controlyerresolver.这个实现在下面的侧边栏中有更多解释:

命名空间欧宝娱乐app下载地址symfony \ component \ httpkernel \ controller采用欧宝娱乐app下载地址Symfony \ HttpFoundation \ \组件请求接口ControllerResolverInterface民众功能getController.要求美元的请求);

在内部,这httpkernel :: change()方法首先调用getController ()在控制器解析器上。此方法被传递要求并根据请求的信息以某种方式确定和返回一个PHP可调用对象(控制器)。

3)kernel.controller事件

典型的目的:在执行控制器之前初始化事物或更改控制器。

内核活动信息表

确定控制器可调用对象后,httpkernel :: change()分派kernel.controller事件。这个事件的监听器可能会在确定了某些事情(例如,控制器,路由信息)但在控制器执行之前初始化需要初始化的系统的某些部分。对于一些示例,请参阅下面的Symfony部分。欧宝娱乐app下载地址

侦听器还可以通过调用来完全更改控制器可调用ControllerEvent :: setController.在此事件上传递给侦听器的事件对象。

4)获取控制器参数

接下来,httpkernel :: change()调用ArgumentResolverInterface: getArguments ().请记住,控制器返回getController ()是一个可责任的。的目的getArguments ()是返回应该传递给该控制器的参数数组。完全是如何完成的完全取决于您的设计,虽然内置了欧宝娱乐app下载地址Symfony \组件\ HttpKernel \ \ ArgumentResolver控制器是一个很好的例子。

此时内核具有PHP可调用(控制器)和一个应在执行该可调用时传递的参数数组。

5)调用控制器

下一个步骤httpkernel :: change()Does是执行控制器。

控制器的作业是为给定资源构建响应。这可能是HTML页面,JSON字符串或其他任何东西。与迄今为止的每个其他部分不同,此步骤由“终端开发人员”实现,该步骤是构建的每个页面的。

通常,控制器将返回a回复对象。如果这是真的,那么内核的工作就差不多完成了!在这种情况下,下一步是kernel.response.事件。

但如果控制器返回任何内容回复,然后内核有点工作要做 -kernel.view.(因为最终目标是总是生成一个回复目的)。

请注意

控制器必须返回某物.如果控制器返回无效的,则会立即引发异常。

6)kernel.view.事件

典型的目的:转换一个非回复从控制器返回值到a回复

内核活动信息表

如果控制器没有返回a回复对象,然后内核分派另一个事件-kernel.view..侦听器对此事件的作业是使用控制器的返回值(例如,数据数组或对象)来创建一个回复

如果你想使用“视图”层,而不是返回回复从控制器中,您返回代表页面的数据。然后,此事件的侦听器可以使用此数据来创建一个回复这是正确的格式(例如,HTML,JSON等)。

在此阶段,如果没有侦听器对事件设置响应,则抛出异常:控制器要么一个视图侦听器必须总是返回回复

请注意

的响应kernel.view.事件,停止传播。这意味着未执行较低优先级的侦听器。

7)kernel.response.事件

典型的目的:修改回复在发送之前的对象

内核活动信息表

内核的最终目标是改变一个要求进入A.回复.的回复可能会在此期间创建kernel.request.事件,从控制器,或由一个侦听器返回给kernel.view.事件。

不管谁创造了回复另一个事件 -kernel.response.之后直接发送。此事件的典型侦听器将修改回复对象的某些方法,例如修改头文件、添加cookie,甚至更改回复本身(例如,在结束之前注射一些JavaScript< /身体>HTML响应的标签)。

在分派此事件之后,最终的回复对象从处理().在最典型的用例中,您可以调用send ()方法,发送标题并打印回复内容。

8)kernel.terminate事件

典型的目的:在将响应发送给用户后执行一些“重”操作

内核活动信息表

httpkernel进程的最终事件是kernel.terminate它是独特的,因为它发生了httpkernel :: change()方法,并在将响应发送给用户之后。回想一下上面,然后是使用内核的代码,结尾是这样的:

//发送标题并呼应内容美元的反应- >发送();//触发kernel.terminate事件$内核- >终止美元的请求美元的反应);

如你所见,通过调用内核- >终止发送响应后,您将触发kernel.terminate事件,您可以执行某些您可能已经延迟的动作,以便尽快返回响应给客户端(例如发送电子邮件)。

谨慎

在内部,HttpKernel使用fastcgi_finish_request.PHP功能。这意味着目前只有PHP FPM.服务器API能够在服务器的PHP进程仍然执行一些任务时向客户端发送响应。对于所有其他服务器api,监听器kernel.terminate仍然执行,但在它们全部完成之前不会将响应发送到客户机。

请注意

使用kernel.terminate事件是可选的,只应在内核实现如果需要调用欧宝娱乐app下载地址Symfony \ \ HttpKernel \ TerminableInterface组件

处理例外:kernel.exception事件

典型的目的:处理某种类型的异常并创建适当的回复返回例外

内核活动信息表

如果在内部任何点抛出异常httpkernel :: change()另一个事件 -kernel.exception抛出。在内部,身体的处理()函数包裹在试用块中。什么时候抛出任何例外时,kernel.exception派遣事件,以便您的系统可以以某种方式回应异常。

向每个此事件的侦听器传递一个欧宝娱乐app下载地址symfony \ component \ httpkernel \ event \ ExceptionEvent对象,可以使用该对象通过getThrowable ()方法。此事件的典型侦听器将检查特定类型的异常并创建适当的错误回复

例如,要生成一个404页面,您可能会抛出一个特殊类型的异常,然后在此事件上添加一个侦听器,该侦听器查找此异常并创建并返回一个404回复.事实上,HttpKernel组件附带一个欧宝娱乐app下载地址symfony \ component \ httpkernel \ enceListener \ ErrorListener,如果您选择使用,它将在默认情况下执行这些操作,并会执行更多操作(请参阅下面的侧栏了解更多细节)。

请注意

的响应kernel.exception事件,停止传播。这意味着未执行较低优先级的侦听器。

创建事件监听器

正如您所看到的,您可以创建并将事件侦听器创建和附加到在此期间发送的任何事件httpkernel :: change()周期。通常,侦听器是一个PHP类,它有一个被执行的方法,但它可以是任何东西。有关创建和附加事件侦听器的更多信息,请参见EventDispatcher组件

控件上的每个“内核”事件的名称都定义为常量欧宝娱乐app下载地址symfony \ component \ httpkernel \ kernelevents类。此外,每个事件侦听器都被传递一个参数,该参数是欧宝娱乐app下载地址symfony \ component \ httpkernel \ event \ KernelEvent.该对象包含关于系统当前状态的信息,每个事件都有自己的事件对象:

名称 KernelEvents持续的 参数传递给侦听器
kernel.request. 内科特::请求 欧宝娱乐app下载地址symfony \ component \ httpkernel \ event \ RequestEvent
kernel.controller 内科特:: Controller. 欧宝娱乐app下载地址Symfony \组件\ HttpKernel \ \ ControllerEvent事件
kernel.controller_arguments KernelEvents: CONTROLLER_ARGUMENTS 欧宝娱乐app下载地址symfony \ component \ httpkernel \ event \ controllerArgumentSevent
kernel.view. 内科特::查看 欧宝娱乐app下载地址Symfony \组件\ HttpKernel \ \ ViewEvent事件
kernel.response. 内科特::响应 欧宝娱乐app下载地址symfony \ component \ httpkernel \事件\ responseavent
kernel.finish_request. 内科特:: finish_request 欧宝娱乐app下载地址Symfony \组件\ HttpKernel \ \ FinishRequestEvent事件
kernel.terminate 内科特::终止 欧宝娱乐app下载地址symfony \ component \ httpkernel \事件\ terminatevent
kernel.exception KernelEvents:异常 欧宝娱乐app下载地址symfony \ component \ httpkernel \ event \ ExceptionEvent

完整的工作示例

当使用HttpKernel组件时,您可以自由地将任何监听器附加到核心事件,使用实现欧宝娱乐app下载地址Symfony \组件\ HttpKernel \ \ ControllerResolverInterface控制器并使用任何实现的参数解析器欧宝娱乐app下载地址symfony \ component \ httpkernel \ controller \ ArgumentResolverInterface.然而,HttpKernel组件自带了一些内置的监听器和其他可以用来创建工作示例的东西:

采用欧宝娱乐app下载地址symfony \ component \ enceDispatcher \ enceDispatcher采用欧宝娱乐app下载地址Symfony \ HttpFoundation \ \组件请求采用欧宝娱乐app下载地址Symfony \ \ HttpFoundation \ RequestStack组件采用欧宝娱乐app下载地址Symfony \ HttpFoundation \ \组件响应采用欧宝娱乐app下载地址Symfony \组件\ HttpKernel \ \ ArgumentResolver控制器采用欧宝娱乐app下载地址symfony \ component \ httpkernel \ controller \ controlyerresolver采用欧宝娱乐app下载地址Symfony \ \ HttpKernel \ EventListener \ RouterListener组件采用欧宝娱乐app下载地址Symfony \ \ HttpKernel \ HttpKernel组件采用欧宝娱乐app下载地址Symfony \组件\ \匹配器\ UrlMatcher路由采用欧宝娱乐app下载地址Symfony \ Component \ Routing \ RequestContext采用欧宝娱乐app下载地址Symfony \ Component \ Routing \ Route采用欧宝娱乐app下载地址Symfony \ \路由\ RouteCollection组件美元的路线新的Routecollection.();美元的路线- >添加'你好'新的路线'/ hello / {name}'“_controller”=>功能要求美元的请求返回新的回复sprintf“你好%s”美元的请求- >得到'名称')));})));美元的请求要求::createFromGlobals();美元的匹配器新的urlmatcher.美元的路线新的请求文本());$调度员新的EventDispatcher.();$调度员- >addSubscriber新的RouterListener美元的匹配器新的RequestStack()));$ ControlyResolver.新的ControllerResolver();$ ArgumentResolver新的ArgumentResolver();$内核新的HttpKernel$调度员$ ControlyResolver.新的RequestStack(),$ ArgumentResolver);美元的反应$内核- >处理美元的请求);美元的反应- >发送();$内核- >终止美元的请求美元的反应);

子请求

除了“主”请求之外httpkernel :: change(),您还可以发送所谓的“子请求”。子请求查找和行动,如任何其他请求,但通常用于仅渲染页面的一小部分而不是完整页面。您将最常见的是从控制器(或者从模板内部的子项请求,由控制器呈现)。

执行子请求,使用httpkernel :: change(),但将第二个参数更改如下:

采用欧宝娱乐app下载地址Symfony \ HttpFoundation \ \组件请求采用欧宝娱乐app下载地址symfony \ component \ httpkernel \ httpkernelinterface/ /……//根据需要手动创建其他请求美元的请求新的要求();例如,可以手动设置它的_controller美元的请求- >属性- >“_controller”'...');美元的反应$内核- >处理美元的请求httpkernelinterface.::SUB_REQUEST);//对这个响应做些什么

这将创建另一个完整的请求-响应周期,其中新的要求转化为回复.内部唯一的区别是一些侦听器(例如安全)可能只对主请求起作用。每个侦听器被传递给欧宝娱乐app下载地址symfony \ component \ httpkernel \ event \ KernelEvent,他的ismasterRequest()可用于检查当前请求是否是“主”或“子”请求。

例如,只需要对主请求进行操作的侦听器可能看起来像这样:

采用欧宝娱乐app下载地址symfony \ component \ httpkernel \ event \ RequestEvent/ /……民众功能onKernelRequestRequestEvent$赛事如果$赛事- >ismasterrequest.())返回/ /……

定位资源

httpkernel组件负责Symfony应用程序中使用的捆绑机制。欧宝娱乐app下载地址捆绑包的关键特征是它们允许覆盖应用程序使用的任何资源(配置文件,模板,控制器,翻译文件等)

这种覆盖机制之所以有效,是因为资源不是通过它们的物理路径而是通过它们的逻辑路径引用的。例如,services . xml文件存储在资源/ config /一个名为FooBundle的包的目录被引用为@FooBundle /资源/配置/ services . xml.当应用程序覆盖该文件时,此逻辑路径将起作用,即使更改Foobundle的目录也是如此。

HttpKernel组件提供了一个被调用的方法locateresource()可用于将逻辑路径转换为物理路径:

美元的路径$内核- >locateResource'@ foobundle / companess / config / services.xml');

这项工作包括代码样本,是在a下获得的许可知识共享BY-SA 3.0许可证。