我想了解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
,实现KernelInterface
。 handle()
函数在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;
应该会破坏应用程序。但是,我的应用程序工作没有任何反应。我在看错了功能还是出了什么问题?
我也多次清除了缓存,并尝试了prod
和dev
环境但没有成功。
修改
它似乎与bootstrap.php.cache
文件有关。如果我将其更改为autoload.php
,则可行。问题是,删除后我得到:
Fatal error: Class 'Symfony\Component\HttpKernel\Kernel' not found in E:\svn\medapp\app\AppKernel.php on line 8
这里有什么问题?如何运行不依赖于自动加载器的应用程序?
答案 0 :(得分:1)
Symfony使用spl_autoload_register()函数自动加载所需的每个类。它使得所有require_once规则都不必要,而只加载了我们需要的类。我在bootstrap.php.cache中找到了这个spl_autoload_register,所以看起来如果你从加载中跳过这个文件,你也杀了自动加载过程。