【问题标题】:Disable symfony cache / appDevDebugProjectContainer.php monster禁用 symfony 缓存/appDevDebugProjectContainer.php 怪物
【发布时间】:2015-12-17 09:26:29
【问题描述】:

我正在接管一个庞大的现有项目。现在我正在寻找一些错误。 但是当到处都有 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);

【问题讨论】:

    标签: php symfony caching


    【解决方案1】:

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

    顺便说一句,堆栈跟踪显示错误发生在InfluencerBundle\Service\YouTube->setConfigParams() 中,它从容器中获取了一个不存在的参数。

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

    【讨论】:

    • 感谢您的详细回答和最佳实践。
    【解决方案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)
    

    【讨论】:

    • 谢谢,是的 - 我知道。我不是在寻找这个特定的错误,而是试图通过现有的(大)代码库来工作。
    猜你喜欢
    • 1970-01-01
    • 2015-09-02
    • 2015-11-30
    • 1970-01-01
    • 2016-10-02
    • 2017-07-13
    • 2018-04-30
    • 1970-01-01
    • 2021-08-07
    相关资源
    最近更新 更多