![](/img/trans.png)
[英]Symfony2 fails silently after 'Symfony\Component\HttpKernel\EventListener\RouterListener'
[英]Symfony2 Kernel vs HttpKernel
我正在尝试关注这篇文章:
另外看看HttpKernel https://github.com/symfony/HttpKernel
我很困惑。 在我看来,内核实际上不仅仅是HttpKernel类,甚至标准的Symfony app.php
也有
$kernel = new AppKernel('prod', false);
$kernel->loadClassCache();
//$kernel = new AppCache($kernel);
$request = Request::createFromGlobals();
$response = $kernel->handle($request);
反过来, $kernel->handle($request)
无论如何都会调用$kernel->handle($request)
的HttpKernel->handle()
; 加上它似乎也照顾加载捆绑?
但是,当内核通过handle()
boot()
创建服务容器时,它还会编译容器,从而无法添加更多参数和服务。
所以我想我的问题是:
compile()
问题? 我有必须添加的参数和服务,我该如何处理? Kernel
是应用程序的最外层shell。 它在Symfony全栈中用于配置调试模式并将bundle,classmap自动加载,容器创建联系在一起。 这里配置了对应用程序“全局”的任何内容。 为方便起见,它还包装了一个HttpKernel
实例,并将所有调用委托给它。
HttpKernel
管理请求/响应生命周期。 它是一个独立的类,用于在事件调度程序上调度事件。 您可以通过添加响应这些事件的侦听器来修改它的行为。 因此,它根本不是特定于应用的。 配置是特定于您的应用程序的HttpKernel
特定实例。
我们来谈谈容器编译。 容器已编译。 此编译过程对其应用了一些优化,并且还添加了一些功能(基于标记修改容器)。 一旦编译,就无法修改(修改会破坏这些优化)。 如果有已编译的容器,则可以将其转储到磁盘。 通过使用PhpDumper
您可以将其转储到生成的PHP类,这比每次构建它更PhpDumper
。
是否有任何具体原因在教程中Framework类扩展了HttpKernel而不是Kernel?
是。 本教程介绍如何使用Symfony2组件构建自己的框架。 Kernel
是Symfony2完整堆栈框架的外壳。 如果您使用它,则不使用自己的框架。 你正在使用Symfony2完整堆栈。
我也应该效仿吗?
这取决于。 如果你想要Kernel
提供的东西,你也可以只使用Symfony完整堆栈。 但是你没有创建自己的框架。
如果是这样,我如何解决compile()问题? 我有必须添加的参数和服务,我该如何处理?
如果你想要一个编译容器,你需要添加这些参数和服务作为扩展(bundle允许你绑定扩展),这些扩展注册服务和参数。 这在编译步骤之前发生,因此可以编译定义并将其转储到文件中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.