Symfony的内核handle()函数在哪里调用?

时间:2015-10-23 14:30:03

标签: php symfony httprequest

我想了解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

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

1 个答案:

答案 0 :(得分:1)

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