Symfony2内核与HttpKernel

mr1*_*011 5 kernel symfony

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

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);
Run Code Online (Sandbox Code Playgroud)

反过来,内核将无论如何调用HttpKernel->handle()内部$kernel->handle($request); 加上它似乎也照顾加载捆绑?

但是,当内核通过其boot()内部创建服务容器时handle(),也会编译容器,从而无法添加更多参数和服务.

所以我想我的问题是:

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

igo*_*orw 10

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

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

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

是否有任何具体原因在教程中Framework类扩展了HttpKernel而不是Kernel?

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

我也应该效仿吗?

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

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

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