2013-04-15 100 views
0

我正在開發一個使用Monolog的項目,它需要Psr/log。 當我通過autoload使用Monolog時,它會抱怨丟失Psr \ Log \ LoggerInterface。 因此,我查看作曲家生成的autoload_namespaces.php,我找不到Psr被註冊。作曲家自動加載命名空間缺失?

這裏是我的供應商/ autoload_namespaces.php

return array(
'Symfony\\Component\\Process' => $vendorDir . '/symfony/process/', 
'Monolog' => $vendorDir . '/monolog/monolog/src/', 
'Imagine' => $vendorDir . '/imagine/Imagine/lib/', 
'Gedmo' => $vendorDir . '/gedmo/doctrine-extensions/lib/', 
'Gaufrette' => $vendorDir . '/knplabs/gaufrette/src/', 
'Evenement' => $vendorDir . '/evenement/evenement/src', 
'Doctrine\\ORM' => $vendorDir . '/doctrine/orm/lib/', 
'Doctrine\\DBAL' => $vendorDir . '/doctrine/dbal/lib/', 
'Doctrine\\Common' => $vendorDir . '/doctrine/common/lib/', 
'Assetic' => $vendorDir . '/kriswallsmith/assetic/src/', 
'Analog' => $vendorDir . '/analog/analog/lib/', 
); 

的內容是作曲家應該爲已經在他們的composer.json文件中定義{}自動加載所有項目註冊命名空間? (我同時檢查了Monolog和Psr/Log,它們都有{autoload}的定義。)

或者我對作曲家有錯誤的想法?

回答

0

你需要明確添加

"psr/log": "1.0.0" 

在composer.json需要塊。該項目monolog/monolog不需要psr/log [你可以在monolog的composer.json文件中驗證]。

然後運行composer update來更新您的自動加載器文件。

[UPDATE]犯了一個錯誤。

我使用monolog 1.2。*,它不需要psr/log。在monolog 1.3。*之後,它確實需要psr/log。在這種情況下,作曲家應該在vendor/autoload_namespaces.php中加載psr/log名稱空間。

比如,我剛剛更新了我的composer.json有

"monolog/monolog": "1.3.*", 
在需要塊

。然後運行composer update monolog/monolog [你可以再次運行這個命令,看它是否解決您的問題在我的供應商/作曲/ autoload_namespaces.php

Loading composer repositories with package information 
Updating dependencies (including require-dev) 
    - Installing psr/log (1.0.0) 
    Loading from cache 

    - Removing monolog/monolog (1.2.1) 
    - Installing monolog/monolog (1.3.1) 
    Downloading: connection... 
    Downloading: 100% 

然後,我發現這個適當的條目:

'Psr\\Log\\' => $vendorDir . '/psr/log', 

這應該工作。有時我也只是運行

composer dump-autoload 

重新生成供應商/作曲家/ autoload_namespaces.php文件。

+0

我在monolog的composer.json文件中看到以下內容。還是我解釋錯了? 「需要」:{ 「PHP」: 「> = 5.3.0」, 「PSR /登錄」: 「〜1.0」 }, https://github.com/Seldaek/monolog/blob/ master/composer.json – Cat

+0

有一段時間沒有跟蹤monolog/monolog。你是對的。它應該自動設置autoload_namespaces.php。我剛剛更新了我的答案。 –

0

我實際上被autoload_namespaces.php數量所困惑。 我在我的問題發佈的一個是在vendor/,然後我發現另一個在vendor/.composer/,最後找到了正確的一個在vendor/composer/

不好意思回答我自己的(愚蠢的)問題,但值得一提的是,如果其他開發者遇到同樣的問題。

感謝@川馬的回答。

+1

擁有如此多的文件可能與使用非常舊版本Composer的遺產有關(作曲家的第一個Alpha版本使用的地點與今天不同) –

0

作曲家登記項目的composer.json文件,例如,基於autoload

{ 
    "autoload": { 
    "classmap": [ 
     "path/to/FirstClass.php", 
     "path/to/SecondClass.php" 
    ] 
    } 
} 

通常composer update會自動重新生成autoload_namespaces.php列出了您的應用程序可以使用(除非你使用多個自動加載)的所有命名空間。

如果命名空間丟失,這裏是更新直接作曲家自動加載命令:

composer dump-autoload -o 

然後,你需要確保你包括我們的腳本的頂部磁帶自動加載機:

<?php 
require_once __DIR__ . '/vendor/autoload.php'; 

見:How to directly autoload classes with Composer?

如果它仍然失敗,請仔細檢查在失敗項目的composer.json文件的語法(E特別是autoload部分)。要進行調試,請嘗試使用-vvvXDebug運行作曲家。