2014-03-31 31 views
1

我嘗試了一段時間通過作曲者導入自己的包,但是我遇到了一些問題。我有以下捆綁:Symfony2 Composer Bundle命名空間

<?php 

namespace Platform\Bundle\PollBundle; 

use Symfony\Component\HttpKernel\Bundle\Bundle; 

class PlatformPollBundle extends Bundle 
{ 
} 

束是供應商/平臺/ pollbundle/

在 「主」 composer.json我definied命名空間用於自動加載:

"autoload": { 
    "psr-0": { 
     "": "src/" , 
     "Platform\\": "vendor/platform" 
    } 
}, 

並在composer.json從包我definied:

{ 
    "name" : "platform/pollbundle", 
    "type": "symfony-bundle", 
    "extra": { 
     "servicePath": "" 
    }, 
    "autoload": { 
     "psr-0": { 
      "Platform\\Bundle\\PollBundle": "" 
     } 
    }, 
    "target-dir": "pollbundle" 

}

在autoload_namespaces中正確的是以下行:

'Platform\\' => array($vendorDir . '/platform'), 

但我得到的錯誤:

Fatal error: Class 'Platform\Bundle\PollBundle\PlatformPollBundle' not found in  ........Controller.php on line 13 

我試圖約100解決方案,但沒有任何工程。如果有人能幫助我,那會很棒。

+0

可能的重複[如何在Symfony2中安裝或集成包](http://stackoverflow.com/questions/7585383/how-to-install-or-integrate-bundles-in-symfony2)< - 它不是管理symfony2包的作曲家,這是symfony。檢查重複的問題 –

+0

首先感謝您的答案,但不爲我工作。我把這個軟件包移動到/ vendor/bundles,並將它添加到composer(相同的命名空間??)autoload中,我嘗試了「$ loader-> registerNamespaces」,但沒有定義該方法 – Zero

+0

忘記了作曲家。捆綁軟件的自動加載由'registerBundles'方法中的AppKernel.php處理。這是一個hacky修復,但也許嘗試在命令行上運行'php app/console generate:bundle',生成一個與你試圖添加的名稱相同的新bundle('PollBundle'),然後覆蓋dir('src/PollBundle')與你試圖添加的那個,看看是否有效 –

回答

1

Bundle不由作曲者裝載,而是由Symfony內核本身處理。在應用程序目錄,編輯AppKernel.php這樣的:

public function registerBundles() 
{ 
    $bundles = array(
     new Symfony\Bundle\FrameworkBundle\FrameworkBundle(), 
     ..., 
     new Platform\Bundle\PollBundle\PlatformPollBundle()//<-- add this 
    ); 
} 

在app/autoload.php文件,同時,註冊新namesepace。它曾經通過$loader實例來完成,通過調用$loader->registerNameSpaces(),但現在,你必須呼籲AnnotationRegistry類的靜態方法:

AnnotationRegistry::registerAutoloadNamespace('PollBundle', 'path/to/PollBundle'); 

哈克修復,我建議,這顯然是什麼固定它爲您,將在控制檯中運行php app/console generate:bundle,以生成具有相同名稱的新捆綁包,然後使用捆綁包簡單地替換該捆綁包的目錄(在src /中)。

+0

我不試試這個^^我的意思是你的第二個評論「關於作曲家忘了。捆綁的自動加載是由AppKernel.php處理的,在registerBundles方法。這是一個哈克修復,但也許嘗試運行PHP應用程序/控制檯生成:捆綁在命令行上,生成一個與你試圖添加的名稱相同的新的綁定(PollBundle),然後用你正在添加的那個命令覆蓋該目錄(src/PollBundle),看看它是否工作正常「 – Zero

+0

@Bee:補充說到底 –

0

在主應用程序中定義任何指向供應商文件夾的任何自動加載都是錯誤的!這是作曲家的作品。 Composer將讀取包含在其中的每個包的自動加載聲明,並自動添加適當的自動加載。沒有必要自己添加這個。

即使您必須使用尚未添加composer.json文件的軟件,只有該軟件包的自動加載應該進入軟件包定義塊,而不是自動加載定義。

+0

這就是他不做的。我的包裏有compose.json,作曲家不讀它。 – Zero

+0

當您定義'「psr-0」:{「Platform \\ Bundle \\ PollBundle」:「」}',並且您嘗試加載類Platform \ Bundle \ PollBundle \ PlatformPollBundle'時,該類必須處於捆綁包的路徑「Platform/Bundle/PollBundle/PlatformPollBundle.php」。你沒有提到你的問題中的文件名 - 你可以驗證路徑是否正確?請注意,您在主composer.json中的定義不會更改任何有關此內容的任何內容,因此如果該捆綁包本身不起作用,則額外的自動加載不會解決任何問題。事實上,這使事情變得更糟(它也影響自動載入性能)。 – Sven

+0

我得到的問題是,bundle/package中的composer.json不會被作曲者加載。例如,我需要「額外」字段,並將其定義在包composer.json中,但我無法使用它。 – Zero