【问题标题】:Where is Symfony's Kernel handle() function called?Symfony 的内核句柄()函数在哪里调用?
【发布时间】:2015-10-23 14:30:03
【问题描述】:

我正在尝试了解 Symfony 的工作原理,因此我正在研究它的内部结构。在app.php 我有这样的事情:

$loader = require_once __DIR__.'/../app/bootstrap.php.cache';  
require_once __DIR__.'/../app/AppKernel.php';

$kernel = new AppKernel('prod', false);
$kernel->loadClassCache();    

$request = Request::createFromGlobals();
$response = $kernel->handle($request);
$response->send();
$kernel->terminate($request, $response);

我感兴趣的是handle() 函数。 AppKernel 扩展了 Kernel,实现了 KernelInterfacehandle() 函数在Kernel 中实现,而不是在AppKernel 中实现。 AppKernel 只注册捆绑包和配置文件。函数如下:

   public function handle(Request $request, $type = HttpKernelInterface::MASTER_REQUEST, $catch = true)
    {
        if (false === $this->booted) {
            $this->boot();
        }

        return $this->getHttpKernel()->handle($request, $type, $catch);
    }

这意味着如果我修改这个函数来做某事,这应该发生在任何请求上。例如,在函数开头键入exit; 应该会破坏应用程序。但是,我的应用程序就像什么也没发生一样工作。我是在查看错误的函数还是出了什么问题?

我也多次清除缓存,并尝试了proddev环境,但都没有成功。

编辑

似乎与bootstrap.php.cache 文件有关。如果我将它改为autoload.php,它就可以工作。问题是删除它后我得到:

Fatal error: Class 'Symfony\Component\HttpKernel\Kernel' not found in E:\svn\medapp\app\AppKernel.php on line 8

这里有什么问题?如何运行不依赖自动加载器的应用程序?

【问题讨论】:

  • 您正在加载 app/autoload.php 文件吗?也许用您正在使用的确切 $loader = 行更新您的问题。因为它应该可以工作。
  • 它最初是 bootstrap.php.cache,我将其更改为 autoload.php。有什么区别,为什么即使它包含在 AppKernel.php 中也找不到内核?
  • 你改变了什么?
  • 而不是 $loader = require_once DIR.'/../app/bootstrap.php.cache';我有 $loader = require_once DIR.'/../app/autoload.php';
  • 删除exit语句,使用--no-warmup选项清除缓存,添加exit语句看看会发生什么

标签: php symfony httprequest


【解决方案1】:

Symfony 使用spl_autoload_register() 函数自动加载每个需要的类。它使所有 require_once 规则变得不必要,而只加载我们需要的类。我在 bootstrap.php.cache 中找到了这个 spl_autoload_register,所以看起来如果你跳过这个文件加载,你也会终止自动加载过程。

【讨论】:

  • Symfony 实际上不使用 spl_autoload_register() (它依赖于使用它的 Composer 自动加载器)。由于某些类(如 Kernel)总是需要的,因此它们包含在 bootstrap.php.cache 文件中。如果您想始终使用自动加载器,您应该要求vendor/autoload.php 而不是app/bootstrap.php.cache。无论如何,这个答案并不能真正回答问题,而应该是评论。
  • 那么为什么删除自动加载器会导致应用程序在 AppKernel(扩展 Kernel)中找不到 Kernel 类?因为包含命名空间,所以它使用 Symfony\Component\HttpKernel\Kernel;为什么没有自动加载器就找不到它以及如何让它在没有自动加载器的情况下找到它?或者如何手动包含它?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多