Symfony2内核与HttpKernel

时间:2012-10-19 15:31:55

标签: symfony kernel

我正在尝试关注这篇文章:

http://fabien.potencier.org/article/62/create-your-own-framework-on-top-of-the-symfony2-components-part-12

还看着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()创建服务容器时,它还会编译容器,从而无法添加更多参数和服务。

所以我想我的问题是:

  1. 在教程中,Framework类是否扩展了HttpKernel而不是内核?
  2. 我还应该效仿吗?或者我应该使用内核作为我的核心。如果是这样,我该如何解决compile()问题?我有必须添加的参数和服务,我该如何处理?

1 个答案:

答案 0 :(得分:10)

Kernel是应用程序的最外层shell。它在Symfony全栈中用于配置调试模式并将bundle,classmap自动加载,容器创建联系在一起。这里配置了对应用程序“全局”的任何内容。它还包含一个HttpKernel实例以方便使用,并将所有调用委托给它。

HttpKernel管理请求/响应生命周期。它是一个独立的类,用于在事件调度程序上调度事件。您可以通过添加响应这些事件的侦听器来修改它的行为。因此,它根本不是特定于应用的。配置是特定于您的应用程序的HttpKernel的特定实例。

我们来谈谈容器编译。容器已编译。此编译过程对其应用了一些优化,并且还添加了一些功能(基于标记修改容器)。一旦编译,就无法修改(修改会破坏这些优化)。如果有已编译的容器,则可以将其转储到磁盘。通过使用PhpDumper,您可以将其转储到生成的PHP类,这比每次构建它都要高效。

  

在教程中,Framework类是否扩展了HttpKernel而不是Kernel,是否有任何特定的原因?

是。本教程介绍如何使用Symfony2组件构建您自己的框架。 Kernel是Symfony2完整堆栈框架的外壳。如果您使用它,则不使用自己的框架。你正在使用Symfony2完整堆栈。

  

我还应该效仿吗?

这取决于。如果你想要Kernel提供的东西,你也可以只使用Symfony完整堆栈。但是你没有创建自己的框架。

  

如果是这样,我该如何解决compile()问题?我有必须添加的参数和服务,我该如何处理?

如果您需要编译容器,则需要将这些参数和服务添加为扩展(bundle允许您绑定扩展),并且这些扩展注册服务和参数。这在编译步骤之前发生,因此可以编译定义并将其转储到文件中。