繁体   English   中英

Symfony2内核与HttpKernel

[英]Symfony2 Kernel vs HttpKernel

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

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);

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

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

所以我想我的问题是:

  1. 是否有任何具体原因在教程中Framework类扩展了HttpKernel而不是Kernel?
  2. 我也应该效仿吗? 或者我应该使用内核作为我的核心。 如果是这样,我如何解决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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM