禁用symfony cache / appDevDebugProjectContainer.php怪物

时间:2015-12-17 09:26:29

标签: php symfony caching

我正在接管一个庞大的现有项目。现在我要去处理一些错误。 但是,当整个地方都有symfony缓存时,很难理解外部代码的作用。

Quit the server with CONTROL-C.
  RUN  '/usr/bin/php' '-S' '127.0.0.1:8000' '/Users/kb1/php/default/projectname/vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Resources/config/router_dev.php'
  ERR  [Thu Dec 17 10:13:08 2015] PHP Fatal error:  Uncaught exception 'Symfony\Component\DependencyInjection\Exception\InvalidArgumentException' with message 'The parameter "youtube_client_id" must be defined.' in /Users/kb1/php/default/projectname/app/cache/dev/appDevDebugProjectContainer.php:4718
  ERR  Stack trace:
  ERR  #0 /Users/kb1/php/default/projectname/src/InfluencerBundle/Service/YouTube.php(74): appDevDebugProjectContainer->getParameter('youtube_client_...')
  ERR  #1 /Users/kb1/php/default/projectname/src/InfluencerBundle/Service/YouTube.php(56): InfluencerBundle\Service\YouTube->setConfigParams()
  ERR  #2 /Users/kb1/php/default/projectname/app/cache/dev/appDevDebugProjectContainer.php(4275): InfluencerBundle\Service\YouTube->__construct(Object(appDevDebugProjectContainer))
  ERR  #3 /Users/kb1/php/default/projectname/vendor/symfony/symfony/src/Symfony/Component/DependencyInjection/Container.php(305): appDevDebugProjectContainer->getYoutubeServiceService()
  ERR  #4 /Users/kb1/php/default/projectname/app/cache/dev/appDevDebugProjectContainer.php(3937): Symfony\Component\DependencyInjection\Container->get in /Users/kb1/php/default/projectname/app/cache/dev/appDevDebugProjectContainer.php on line 4718

问题是,几乎每个方法都在这个巨大的5000 LOC appDevDebugProjectContainer.php容器中。

已经尝试Disabling the Bootstrap File and Class Caching¶ 虽然used autoload.php and not bootstrap.php.cache

这是我的app_dev.php:

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

$kernel = new AppKernel('dev', true);
// $kernel->loadClassCache();
$request = Request::createFromGlobals();
$response = $kernel->handle($request);
$response->send();
$kernel->terminate($request, $response);

2 个答案:

答案 0 :(得分:4)

无法避免倾倒的容器。使用非转储容器会很慢(特别是对于大容器),这就是内核没有选择绕过它的原因。 无论如何,这会使调试更加痛苦。使用转储容器,您可以看到错误来自new MediaPlayer.OnVideoSizeChangedListener(),即getYoutubeServiceService服务的实例化。如果没有转储容器,您只会看到到达ContainerBuilder的堆栈跟踪,而没有关于此时正在实例化哪个服务的任何信息。

顺便说一下,堆栈跟踪显示错误发生在youtube.service,它从容器中获取一个不存在的参数。

在侧节点上,在服务中注入参数而不是注入整个容器会更加清晰(您的服务不依赖于容器本身,而是依赖于它的真正依赖性)并且会让您更容易理解错误消息(因为容器可能告诉您,您的服务在验证容器时使用不存在的参数)

答案 1 :(得分:2)

首先,此引导程序文件可能看起来很吓人,但我不建议您禁用它。如果您仔细查看错误消息,它们总是会告诉您在引导程序文件之外的确切位置。

例如,在您的情况下,错误是:

The parameter "youtube_client_id" must be defined.

错误的起源在:

src/InfluencerBundle/Service/YouTube.php (line 74)
(which was called from) src/InfluencerBundle/Service/YouTube.php (line 56)