Men*_*zzo 9 php path root package composer-php
我正在使用composer开发一个名为php-app-config的PHP组件.这个组件,一旦需要另一个项目,并使用,应该在根包的config文件夹中查找配置文件,如.composer installroot_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
Run Code Online (Sandbox Code Playgroud)
根包可以是Web应用程序或命令行实用程序.有没有办法使用composer获取根包路径?如果没有,有什么更好的方法?
使用ReflectionClass:
$reflection = new \ReflectionClass(\Composer\Autoload\ClassLoader::class);
$vendorDir = dirname(dirname($reflection->getFileName()));
Run Code Online (Sandbox Code Playgroud)
您可以使用 Composer 自己的方法\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
我建议通过将根路径定义为常量来“锚定”您的应用程序(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 时,这将不起作用。
有没有办法使用 Composer 获取根包路径?
如果您有 Composer 对象,则可以从 Config 对象中获取供应商目录的路径:
$vendorPath = $composer->getConfig()->get('vendor-dir');
Run Code Online (Sandbox Code Playgroud)
然后,向上移动一个文件夹$config = dirname($vendorPath) . '/config/config.yml';