7

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

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

也在看 HttpKernel https://github.com/symfony/HttpKernel

我很困惑。在我看来,Kernel 确实比这里的 HttpKernel 类要多得多,甚至标准的 Symfonyapp.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. 在教程中框架类扩展 HttpKernel 而不是 Kernel 是否有任何具体原因?
  2. 我也应该效仿吗?或者我应该使用内核作为我的核心。如果是这样,我该如何解决这个compile()问题?我确实有必须添加的参数和服务,我该如何处理?
4

1 回答 1

13

Kernel是应用程序的最外层。它在 Symfony 全栈中用于配置调试模式并将捆绑包、类映射自动加载、容器创建捆绑在一起。任何对应用程序“全局”的东西都在这里配置。为了方便起见,它还包装了一个HttpKernel实例,并将所有调用委托给它。

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

我们来谈谈容器编译。容器已编译。这个编译过程对其进行了一些优化,并且还添加了一些功能(根据标签修改容器)。一旦它被编译,它就不能被修改(修改会破坏那些优化)。当你有一个已编译的容器时,你可以将它转储到磁盘。通过使用,PhpDumper您可以将其转储到生成的 PHP 类中,这比每次都构建它的性能要高得多。

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

是的。本教程是关于如何使用 Symfony2 组件构建自己的框架。Kernel是 Symfony2 全栈框架的外壳。如果你使用它,你就没有使用你自己的框架。您正在使用 Symfony2 全栈。

我也应该效仿吗?

这取决于。如果你想要Kernel提供的东西,你还不如使用 Symfony 全栈。但是,您并没有创建自己的框架。

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

If you want a compiled container, you'll need to add those parameters and services as extensions (bundles allow you to tie in extensions), and those extensions register services and parameters. This happens before the compilation step, so that the definitions can then be compiled and dumped to a file.

于 2012-10-19T16:03:58.693 回答