我正在尝试关注这篇文章:
还看着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);
内核依次会在HttpKernel->handle()
内调用$kernel->handle($request)
;加上它似乎也在照顾装载捆绑包?
但是,当内核在boot()
内通过handle()
创建服务容器时,它还会编译容器,从而无法添加更多参数和服务。
所以我想我的问题是:
compile()
问题?我有必须添加的参数和服务,我该如何处理?答案 0 :(得分:10)
Kernel
是应用程序的最外层shell。它在Symfony全栈中用于配置调试模式并将bundle,classmap自动加载,容器创建联系在一起。这里配置了对应用程序“全局”的任何内容。它还包含一个HttpKernel
实例以方便使用,并将所有调用委托给它。
HttpKernel
管理请求/响应生命周期。它是一个独立的类,用于在事件调度程序上调度事件。您可以通过添加响应这些事件的侦听器来修改它的行为。因此,它根本不是特定于应用的。配置是特定于您的应用程序的HttpKernel
的特定实例。
我们来谈谈容器编译。容器已编译。此编译过程对其应用了一些优化,并且还添加了一些功能(基于标记修改容器)。一旦编译,就无法修改(修改会破坏这些优化)。如果有已编译的容器,则可以将其转储到磁盘。通过使用PhpDumper
,您可以将其转储到生成的PHP类,这比每次构建它都要高效。
在教程中,Framework类是否扩展了HttpKernel而不是Kernel,是否有任何特定的原因?
是。本教程介绍如何使用Symfony2组件构建您自己的框架。 Kernel
是Symfony2完整堆栈框架的外壳。如果您使用它,则不使用自己的框架。你正在使用Symfony2完整堆栈。
我还应该效仿吗?
这取决于。如果你想要Kernel
提供的东西,你也可以只使用Symfony完整堆栈。但是你没有创建自己的框架。
如果是这样,我该如何解决compile()问题?我有必须添加的参数和服务,我该如何处理?
如果您需要编译容器,则需要将这些参数和服务添加为扩展(bundle允许您绑定扩展),并且这些扩展注册服务和参数。这在编译步骤之前发生,因此可以编译定义并将其转储到文件中。