如何使用composer获取根包路径

时间:2016-06-20 14:45:35

标签: php path package composer-php root

我正在使用php-app-config开发名为composer的PHP组件。 此组件一旦被另一个项目需要并使用composer install安装,就应该在root package的config文件夹中查找配置文件,类似于root_package/config/config.yml

./config/config.yml应仅存在于根包中,而不应存在于composer.json中“require:”导入的组件内部,如下所示:

▾ 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

root包可以是Web应用程序或命令行实用程序。 有没有办法使用composer获取根包路径?如果没有,那么更好的方法是什么?

3 个答案:

答案 0 :(得分:7)

使用ReflectionClass:

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

答案 1 :(得分: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常量,它直接指向应用程序的config文件夹。)

  • 您还可以尝试从依赖项中获取一些文件夹级别。

    php-app-config/Config.php中,您将使用__DIR__,即root-package/vendor/robotdance/php-app-config/src。现在,您需要达到4级才能达到root-package/

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

    当您的应用程序打包为PHAR时,这将无法解决。

  

有没有办法使用Composer获取根包路径?

如果您有Composer对象,则可以从Config对象获取供应商目录的路径:

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

然后,向上一个文件夹$config = dirname($vendorPath) . '/config/config.yml';

答案 2 :(得分:2)

您可以使用作曲家自己的\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