2016-06-20 49 views
4

我正在開發一個名爲php-app-config的PHP組件,使用composer。 此組件一旦被另一個項目需要,並且使用composer install進行安裝,就應該在root package的config文件夾中尋找配置文件,如root_package/config/config.yml如何使用作曲家獲得根包路徑

./config/config.yml應當只存在於根包,而不是由「要求:」導入的部件內部中composer.json,如下:

▾ root-package/ 
    ▸ bin/ 
    ▸ build/ 
    ▾ config/ 
    ▸ locales/ 
     config.yml 
    ▸ src/ 
    ▸ tests/ 
    ▾ vendor/ 
    ▸ composer/ 
    ▸ phpdocumentor/ 
    ▸ phpspec/ 
    ▸ phpunit/ 
    ▾ robotdance/ 
     ▾ php-app-config/ 
     ▾ src/                                                
     Config.php -> how to get the root "config/config.yml" path from here? 
     ▸ tests/ 
     composer.json 
     composer.lock 
     phpunit.xml 
     README.md 

根包可以是web應用或命令行實用程序。 有什麼方法可以使用composer獲取根包路徑?如果不是,那麼更好的方法是什麼?

回答

2
  • 我建議通過將根路徑定義爲常量來「錨定」您的應用程序(web或cli)。

    例如,如果您有一個root-package/src/application.php文件,它應該知道它的位置,類似define('APP_ROOT_FOLDER', dirname(__DIR__));可以提供幫助。一旦聲明常量,它也可用於依賴關係。

    所以,在/php-app-config/Config.php您只需使用常數:

    $config = APP_ROOT_FOLDER . '/config/config.yml';

    (或定義APP_CONFIG_ROOT_FOLDER常數,它直接指向應用程序的配置文件夾)

  • 你也可以嘗試去從依賴關係的文件夾級別。您可以使用__DIR__,即root-package/vendor/robotdance/php-app-config/src。現在,你需要去4級才能達到root-package/

    $config = __DIR__.'/../../../../config/config.yml';

    這不會奏效,當你的應用程序被打包成藥業。


有沒有辦法使用Composer來獲取根包路徑?

如果你有作曲家對象,你可以得到供應商目錄從配置對象的路徑:

$vendorPath = $composer->getConfig()->get('vendor-dir'); 

然後,去一個文件夾最多$config = dirname($vendorPath) . '/config/config.yml';

+0

我試過[GETCWD()](http://php.net/manual/en/function.getcwd.php),似乎使用作曲家提供的自動加載器按預期工作。 – Menegazzo

+3

如何獲取作曲家對象?是否像'使用作曲家\作曲家; $ composer = Composer :: getComposer();'? – Menegazzo

+2

處理'vendor-dir'的代碼片段只考慮直接位於根包內的目錄。 'vendor-dir'的'dist/php'就會中斷。從「InstallationManager」獲取安裝路徑是理想的,但此時對根包沒有特殊處理,並且在請求根包的安裝位置時會在'vendor-dir'內返回一個安裝路徑。我發現的最好的方法是做'dirname(\ Composer \ Factory :: getComposerFile());'在包的目錄之外執行時也可以工作。 –

1

使用ReflectionClass:

$reflection = new \ReflectionClass(\Composer\Autoload\ClassLoader::class); 
$vendorDir = dirname(dirname($reflection->getFileName())); 

但是,如果您需要知道供應商目錄的要求autoload.php,t母雞可以檢查是否存在ClassLoader類:

if (!class_exists('\Composer\Autoload\ClassLoader')) { 
    require 'vendor/autoload.php'; 
} 
1

您可以使用作曲家的自己的\Composer\Factory::getComposerFile();去項目的根目錄:

$projectRootPath = dirname(\Composer\Factory::getComposerFile());

並與你的情況,你可以訪問你的root-package/config/config.yml通過:

$configYmlPath = $projectRootPath . '/config/config.yml'

別忘了添加composer你依賴的\Composer\Factory::class可用:

$ composer require composer/composer