Symfony2内核与HttpKernel

Symfony2内核与HttpKernel,symfony,kernel,Symfony,Kernel,我试着跟随这篇文章: 也看看HttpKernel 我很困惑。在我看来,内核实际上比这里的HttpKernel类要多得多,甚至标准的Symfonyapp.php也有 $kernel = new AppKernel('prod', false); $kernel->loadClassCache(); //$kernel = new AppCache($kernel); $request = Request::createFromGlobals(); $response = $kernel

我试着跟随这篇文章:

也看看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)
中的
HttpKernel->handle()
;此外,它似乎还负责装载捆绑包

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

所以我想我的问题是:

  • 在本教程中,框架类扩展HttpKernel而不是Kernel有什么具体原因吗
  • 我也应该效仿吗?或者我应该使用内核作为我的核心。如果是这样,我该如何避开
    compile()
    问题?我必须添加参数和服务,如何处理

  • 内核是应用程序的最外层外壳。它在Symfony full stack中用于配置调试模式,并将bundle、类映射自动加载和容器创建绑定在一起。应用程序的任何“全局”都在此处配置。为了方便起见,它还包装了一个
    HttpKernel
    实例,并将所有调用委托给它

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

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

    在本教程中,框架类扩展HttpKernel而不是Kernel有什么具体原因吗

    对。本教程介绍如何使用Symfony2组件构建自己的框架<代码>内核
    是Symfony2全栈框架的外壳。如果你使用它,你就不是在使用你自己的框架。您正在使用Symfony2完整堆栈

    我也应该效仿吗

    视情况而定。如果您想要
    内核
    提供的东西,那么最好使用Symfony full stack。但是,您并不是在创建自己的框架

    如果是这样的话,我如何避开compile()问题?我必须添加参数和服务,如何处理


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

    感谢您提供了非常详细和信息丰富的答案。因此,我似乎可以扩展Symfony容器,稍微重写它的一些方法来延迟容器的编译,以满足我的需要。或者,我也可以利用bundle(通过编写我自己的bundle并在其中添加我自己的服务和参数)?您可能需要添加一些扩展,可能还需要向编译过程添加编译器传递。我很抱歉要求太多。所以我试着在谷歌上搜索什么是“扩展”,发现了这篇文章:这篇文章也很有用。因此,为了确认(我只是想确保我做得正确),我必须创建我自己的包,然后在这个包中创建我自己的扩展,以便在编译之前完成与容器相关的所有繁重工作;这允许我像往常一样使用sf2内核。是的,您需要为容器创建DependencyInjection扩展。