我正在使用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获取根包路径?如果没有,那么更好的方法是什么?
答案 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