HttpKernel组件:HttpKernel类
编辑该页面警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 6.0,不再维护。
读这个页面的更新版本Symfob娱乐下载ony 6.2(当前的稳定版本)。
HttpKernel组件:HttpKernel类
如果你现在使用我们的框架,你可能需要添加支持自定义错误消息。我们有404和500错误的支持,但硬编码在框架本身的响应。使它们可定制的很简单:派遣一个新的事件,听它。这样做就意味着侦听器调用常规控制器。但是如果误差控制器将抛出一个异常呢?你最终会在一个无限循环。应该有一个更简单的方法,对吧?
进入HttpKernel
类。而不是解决同样的问题一次又一次,而不是每次重新发明轮子,HttpKernel
类是一个通用的、可扩展的、灵活的实现HttpKernelInterface
。
这门课非常类似于我们写了到目前为止的框架类:它分派事件在一些战略点的处理请求时,它使用一个控制器解析器选择控制器将请求调度,和一个额外的好处,它负责边界情况,出现问题时提供伟大的反馈。
这是新框架代码:
1 2 3 4 5 6 7 8
/ / example.com/src/Simplex/Framework.php名称空间单纯形;使用ob娱乐下载\组件\HttpKernel\HttpKernel;类框架扩展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
/ / example.com/web/front.phprequire_once__DIR__。“/ . . /供应商/ autoload.php”;使用ob娱乐下载\组件\EventDispatcher\EventDispatcher;使用ob娱乐下载\组件\HttpFoundation\请求;使用ob娱乐下载\组件\HttpFoundation\RequestStack;使用ob娱乐下载\组件\HttpFoundation\响应;使用ob娱乐下载\组件\HttpKernel;使用ob娱乐下载\组件\路由;美元请求=请求::createFromGlobals ();美元requestStack=新RequestStack ();美元路线=包括__DIR__。“/ . . / src / app.php”;美元上下文=新路由\ RequestContext ();美元匹配器=新路由\匹配器\ UrlMatcher (美元路线,美元上下文);美元controllerResolver=新HttpKernel \控制器\ ControllerResolver ();美元argumentResolver=新HttpKernel \控制器\ ArgumentResolver ();美元调度程序=新EventDispatcher ();美元调度程序- >addSubscriber (新HttpKernel \ EventListener \ RouterListener (美元匹配器,美元requestStack));美元框架=新单纯形\框架(美元调度程序,美元controllerResolver,美元requestStack,美元argumentResolver);美元响应=美元框架- >处理(美元请求);美元响应- >send ();
RouterListener
是相同的逻辑的实现我们在我们的框架:它匹配传入的请求和填充与路由请求属性参数。
我们现在的代码更加简洁和令人惊讶的是比以往任何时候都更强大和更强大的。例如,使用内置的ErrorListener
让你的错误管理配置:
1 2 3 4 5 6
美元errorHandler=函数组ob娱乐下载件(Symfony \ \ ErrorHandler \ \ FlattenException异常美元异常){美元味精=“事情错了!('。美元异常- >getMessage ()。“)”;返回新响应(美元味精,美元异常- >getStatusCode ());};美元调度程序- >addSubscriber (新HttpKernel \ EventListener \ ErrorListener (美元errorHandler));
ErrorListener
给你一个FlattenException
实例,而不是扔异常
或错误
实例来缓解异常处理和显示。它可以采取任何有效的控制器作为一个异常处理程序,所以你可以创建一个ErrorController类,而不是使用一个闭包:
1 2 3 4
美元侦听器=新HttpKernel \ EventListener \ ErrorListener (“日历\控制器\ ErrorController:异常”);美元调度程序- >addSubscriber (美元侦听器);
误差控制器读取如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
/ / example.com/src/Calendar/Controller/ErrorController.php名称空间日历\控制器;使用ob娱乐下载\组件\ErrorHandler\异常\FlattenException;使用ob娱乐下载\组件\HttpFoundation\响应;类ErrorController{公共函数异常(FlattenException美元异常){美元味精=“事情错了!('。美元异常- >getMessage ()。“)”;返回新响应(美元味精,美元异常- >getStatusCode ());}}
瞧!清洁和可定制的错误管理没有努力。如果你的ErrorController
抛出一个异常,HttpKernel将很好地处理它。
在第二章中,我们讨论了回应::准备()
方法,确保符合响应HTTP规范。这可能是一个好主意总是叫它之前发送响应给客户端;这就是ResponseListener
:
1
美元调度程序- >addSubscriber (新HttpKernel \ EventListener \ ResponseListener (“utf - 8”));
如果你想要开箱即用的支持流反应,订阅StreamedResponseListener
:
1
美元调度程序- >addSubscriber (新HttpKernel \ EventListener \ StreamedResponseListener ());
在你的控制器,返回StreamedResponse
实例,而不是响应
实例。
提示
读了内置Symfonyob娱乐下载事件参考学习更多关于HttpKernel派出的事件以及他们如何允许您更改请求的流程。
现在,让我们创建一个监听器,允许一个控制器返回一个字符串,而不是一个完整的响应对象:
1 2 3 4 5 6 7 8 9 10 11 12
类LeapYearController{公共函数指数(美元一年){美元leapYear=新LeapYear ();如果(美元leapYear- >isLeapYear (美元一年)){返回“是的,这是一个闰年!”;}返回“不,这不是一个闰年。;}}
要实现这个功能,我们要听kernel.view
事件,触发后控制器被称为。它的目标是将控制器返回值转换为一个适当的回应,但前提是需要:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21日22日23日
/ / example.com/src/Simplex/StringResponseListener.php名称空间单纯形;使用ob娱乐下载\组件\EventDispatcher\EventSubscriberInterface;使用ob娱乐下载\组件\HttpFoundation\响应;使用ob娱乐下载\组件\HttpKernel\事件\ViewEvent;类StringResponseListener实现了EventSubscriberInterface{公共函数onView(ViewEvent美元事件){美元响应=美元事件- >getControllerResult ();如果(is_string (美元响应)){美元事件- >setResponse (新响应(美元响应));}}公共静态函数getSubscribedEvents(){返回(“kernel.view”= >“onView”];}}
代码很简单,因为kernel.view
事件时才触发控制器返回值不是一个反应,因为设置响应事件停止事件传播(我们的听众不能干扰其他视图的听众)。
别忘了登记在前端控制器:
1
美元调度程序- >addSubscriber (新单纯形\ StringResponseListener ());
请注意
如果您忘记注册用户,HttpKernel将抛出一个异常漂亮的信息:控制器必须返回一个响应(不,这不是一个闰年。鉴于)。
。
在这一点上,我们的整个框架代码尽可能紧凑,它主要由一个装配现有的库。扩展是一种注册事件侦听器/用户。
希望你现在有一个更好的理解为什么看似简单HttpKernelInterface
是如此的强大。它的默认实现,HttpKernel
,给你很多很酷的功能,可以使用开箱即用的,没有努力。因为HttpKernel实际上是权力Symfony框架的代码,你有最好的两个世界:一个自定义的框架,根据您的需要,但基于ob娱乐下载坚如磐石的和维护底层架构,为许多网站已经被证明能对感冒生效;一个代码,已经审计的安全问题,已经被证明很好地伸缩。