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

ali*_*lik 2 php autoload composer-php

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

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

我想让这些*.res文件位于它们各自的类文件旁边(或在子文件夹中,例如/locale/)。为此,如果我能以某种方式获取类文件路径而无需在 Composer 的自动加载器中重新实现现有代码,我将表示欢迎。

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

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

Tns*_*Tns 5

是的,有可能, require'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);
Run Code Online (Sandbox Code Playgroud)

输出:

string(64) "/home/user/src/app/vendor/monolog/monolog/src/Monolog/Logger.php"
Run Code Online (Sandbox Code Playgroud)