Php Symfony';调用的内核句柄()函数?
我试图理解Symfony是如何工作的,所以我来看看它的内部结构。在Php Symfony';调用的内核句柄()函数?,php,symfony,httprequest,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 = Req
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函数开头的code>应中断应用程序。然而,我的应用程序工作起来就像什么都没发生一样。我看到的是错误的函数还是出了什么问题
我还多次清除缓存,并尝试了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
这里有什么问题?如何运行不依赖自动加载器的应用程序?Symfony使用该函数自动加载所需的每个类。它使得所有require_once规则都不必要,而只加载我们需要的类。我在bootstrap.php.cache中找到了这个spl\u autoload\u寄存器,因此,如果您从加载中跳过此文件,那么您也会终止自动加载过程。是否正在加载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
语句并查看发生了什么事SYMFONY实际上没有使用spl_autoload_register()(它依赖于使用它的Composer autoloader)。由于某些类(如Kernel)总是需要的,因此它们包含在bootstrap.php.cache文件中。如果希望始终使用自动加载程序,则应要求使用vendor/autoload.php
而不是app/bootstrap.php.cache
。无论如何,这个答案并没有真正回答这个问题,应该是一个注释。那么为什么删除自动加载器会导致应用程序在AppKernel中找不到内核类(它扩展了内核)?因为包含了名称空间,所以它使用了Symfony\Component\HttpKernel\Kernel;为什么没有自动加载器它就找不到它?如何让它在没有自动加载器的情况下找到它?或者如何手动包含它?