【问题标题】:Symfony2 Kernel vs HttpKernelSymfony2 内核与 HttpKernel
【发布时间】:2012-10-10 06:23:24
【问题描述】:

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

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 类要多得多,甚至标准的 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 而不是 Kernel,是否有任何具体原因?
  2. 我也应该效仿吗?或者我应该使用内核作为我的核心。如果是这样,我该如何解决compile() 问题?我确实有需要添加的参数和服务,我该如何处理?

【问题讨论】:

    标签: symfony symfony-http-kernel


    【解决方案1】:

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

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

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

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

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

    我也应该效仿吗?

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

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

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

    【讨论】:

    • 感谢您提供非常详细和翔实的回答。所以看起来我可以扩展 Symfony 容器,稍微覆盖它的一些方法来延迟容器的编译以满足我的需要。或者,我也可以利用 bundle(通过编写我自己的 bundle 并在那里添加我自己的服务、参数)?
    • 您可能想要添加一些扩展,并且可能还需要将编译器传递给编译过程。
    • 非常抱歉问的太多。因此,我尝试在 Google 上搜索什么是“扩展”,并找到了这篇文章:symfony.com/doc/2.0/cookbook/bundles/extension.html,还有这篇很有帮助的richardmiller.co.uk/2011/04/15/symfony2-controller-as-service。所以只是为了确认(我只是想确保我做对了),我必须创建自己的包,然后在这个包中创建自己的扩展,以便在编译之前完成与容器相关的所有繁重工作;这让我可以像往常一样使用 sf2 内核。
    • 是的,你需要为容器创建一个DependencyInjection Extension。
    猜你喜欢
    • 2016-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-22
    • 1970-01-01
    • 2018-03-06
    • 1970-01-01
    相关资源
    最近更新 更多