2015-12-17 73 views
2

我正在接管一個巨大的現有項目。現在我正在追求一些錯誤。 但是,當symfony緩存到處都是外國代碼很難理解的。禁用symfony緩存/ appDevDebugProjectContainer.php怪物

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

起初,這引導文件可能看起來嚇人,但我不建議你將其禁用。如果仔細查看錯誤消息,他們會始終告訴你在bootstrap文件之外的位置。

例如,在你的情況下,錯誤是:

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) 
+0

謝謝,是的 - 我知道。我不是在尋找這個特定的錯誤,而是試圖通過現有的(大)代碼庫。 –

4

轉儲的容器無法避免。使用非轉儲容器的速度會很慢(特別是對於一個大容器),這就是爲什麼內核無法繞過它的原因。不管怎樣,這會使調試更加痛苦。使用轉儲的容器,您可以看到錯誤來自getYoutubeServiceService,即youtube.service服務的實例化。如果沒有轉儲容器,您只會看到一個堆棧跟蹤到達ContainerBuilder,而沒有任何有關當前正在實例化哪個服務的信息。

而順便說一下,堆棧跟蹤顯示錯誤發生在InfluencerBundle\Service\YouTube->setConfigParams(),它從容器中獲取一個不存在的參數。

在一個側面的節點上,在你的服務中注入參數而不是注入整個容器會更清潔(你的服務不會依賴於容器本身,而是依賴於它的真正依賴),並且會讓你更容易理解錯誤信息(因爲容器可能告訴你,當你驗證容器時你的服務使用了一個不存在的參數)

+0

感謝您的詳細解答和最佳做法。 –