如何在使用composer autoload时获取加载类的文件路径?

时间:2018-02-18 15:27:52

标签: php composer-php autoload

PHP 7.1应用程序使用composer的自动加载器来查找类定义。命名空间映射在composer.json文件中定义。

该应用程序还使用ICU模块的ResourceBundle类从*.res文件加载可本地化的文本。每个具有可本地化文本的类都有自己的*.res文件集(每种语言一个文件)。提供本地化支持的代码获取应加载其文本的类的完全限定名称。

我希望*.res文件位于各自的类文件旁边(或者在子文件夹中,例如/locale/)。为此我欢迎,如果我能以某种方式获得类文件路径,而无需重新实现作曲家的自动加载器中的现有代码。

理想情况下,我应该能够在不需要实例化类并以某种方式获取其文件位置的情况下获取路径。

这种方法可行吗?你有什么建议?

1 个答案:

答案 0 :(得分:2)

是的,有可能,'vendor/autoload.php'实际上会返回一个自动加载器实例:

/* @var $loader \Composer\Autoload\ClassLoader */
$loader = require 'vendor/autoload.php';

$class = \Monolog\Logger::class;

$loggerPath = $loader->findFile($class);
if (false === $loggerPath) {
    throw new \RuntimeException("Cannot find file for class '$class'");
}
$realLoggerPath = realpath($loggerPath);
if (false === $realLoggerPath) {
    throw new \RuntimeException("File '$loggerPath' found for class '$class' does not exists");
}

var_dump($realLoggerPath);

输出:

string(64) "/home/user/src/app/vendor/monolog/monolog/src/Monolog/Logger.php"