gpt4 book ai didi

Symfony2 内核与 HttpKernel

转载 作者:行者123 更新时间:2023-12-03 01:55:27 25 4
gpt4 key购买 nike

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

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

无论如何,内核都会在 $kernel->handle($request) 中调用 HttpKernel->handle() ;另外,它似乎也负责加载 bundle ?

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

所以我想我的问题是:

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

最佳答案

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

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

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

Is there any specific reason that in the tutorial the Framework class extends HttpKernel instead of Kernel?

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

Should I also follow suit?

这要看情况。如果您想要 Kernel 提供的东西,您不妨使用 Symfony 全栈。但这样您就不会创建自己的框架。

And if so, how do I get around the compile() issue? I do have parameters and services I have to add, how do I handle?

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

关于Symfony2 内核与 HttpKernel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12977607/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com