我正在接管一个庞大的现有项目。现在我要去处理一些错误。 但是,当整个地方都有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);
答案 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)