我正在使用Composer开发一个称为PHP-App-Config的PHP组件。此组件曾经是另一个项目要求的,并使用composer install
安装,应在根软件包的配置文件夹中查找配置文件,例如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
根包可以是Web应用程序或命令行实用程序。有什么方法可以使用作曲家获取根软件包路径?如果没有,更好的方法是什么?
使用ReflectionClass:
$reflection = new ReflectionClass(ComposerAutoloadClassLoader::class);
$vendorDir = dirname(dirname($reflection->getFileName()));
您可以使用作曲家自己的ComposerFactory::getComposerFile();
进入项目根目录:
$projectRootPath = dirname(ComposerFactory::getComposerFile());
,如果您的情况,您可以通过:
访问root-package/config/config.yml
$configYmlPath = $projectRootPath . '/config/config.yml'
不要忘记将composer
添加到您的依赖项中,以使ComposerFactory::class
可用:
$ composer require composer/composer
-
我建议通过将根路径定义为常数来"锚定"您的应用程序(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
常数。) -
您也可以尝试从依赖项上提高一些文件夹级别。
在
php-app-config/Config.php
中,您将使用__DIR__
,即root-package/vendor/robotdance/php-app-config/src
。现在,您需要达到4个级别才能达到root-package/
。$config = __DIR__.'/../../../../config/config.yml';
当您的应用程序包装为Phar时,这将无法解决。
有什么方法可以使用作曲家获取根包路径?
如果您有作曲家对象,则可以从配置对象获取供应商目录的路径:
$vendorPath = $composer->getConfig()->get('vendor-dir');
然后,将一个文件夹up $config = dirname($vendorPath) . '/config/config.yml';