为了账号安全,请及时绑定邮箱和手机立即绑定

如何通过 Script\Event 获取作曲家自动加载类映射?

如何通过 Script\Event 获取作曲家自动加载类映射?

PHP
GCT1015 2022-01-08 17:31:22
我目前通过明确要求文件来获取自动加载类映射$map = require 'vendor/composer/autoload_classmap.php';但是我的班级已经在导入Composer\Script\Event班级并使用 Composer 实例<?phpnamespace Acme;use Composer\Script\Event;class Foo{   public static function bar(Event $event)   {      $extra = $event->getComposer()->getPackage()->getExtra();      $autoload = $event->getComposer()->getPackage()->getAutoload();   }}如何以$extra 与获取and相同的方式获取自动加载类映射$autoload?(不使用require)
查看完整描述

1 回答

?
森栏

TA贡献1810条经验 获得超5个赞

这$event->getComposer()->getPackage()->getAutoload()是我所知道的从 Composer 对象获取自动加载信息的唯一方法。我使用以下函数来处理 的结果getAutoload(),希望这些信息足以回答您的问题。


function parseAutoload(Event $event)

{

    foreach ($event->getComposer()->getPackage()->getAutoload() as $std => $lookup) {

        switch ($std) {

            case "psr-0":

            case "psr-4":

                foreach ($lookup as $namespace => $paths) {

                    if (substr($namespace, -1) != "\\") {

                        $namespace .= "\\";

                        // TODO Maybe produce a warning?

                    }

                    if (!is_array($paths)) {

                        $paths = array($paths);

                    }

                    foreach ($paths as $path) {

                        if (substr($path, 0, -1) != DIRECTORY_SEPARATOR) {

                            $path .= DIRECTORY_SEPARATOR;

                        }

                        if (is_dir($path)) {

                            $directory = new RecursiveDirectoryIterator($path);

                            $iterator = new RecursiveIteratorIterator($directory);

                            $regex = new RegexIterator($iterator,

                                '/^' . preg_quote($path, DIRECTORY_SEPARATOR) . '(.+)\.php$/i',

                                RegexIterator::REPLACE);

                            $regex->replacement = '$1';

                            foreach ($regex as $file => $class) {

                                $class = "{$namespace}" . str_replace(DIRECTORY_SEPARATOR, "\\", $class);

                                echo "Found class '{$class}' at '{$file}'";

                            }

                        }

                    }

                }

                break;

            case "classmap":

                foreach ($lookup as $class => $path) {

                    echo "Found class '{$class}' at '{$path}'";

                }

                break;

            case "files":

                foreach ($lookup as $i => $path) {

                    if (is_readable($path)) {

                        $code = file_get_contents($path);

                        $tokens = token_get_all($code);

                        // File all the classes in the file.

                        for ($i = 2; $i < count($tokens); $i++) {

                            if ($tokens[$i - 2][0] == T_CLASS &&

                                $tokens[$i - 1][0] == T_WHITESPACE &&

                                $tokens[$i][0] == T_STRING

                            ) {

                                $class = $tokens[$i][1];

                                echo "Found class '{$class}' at '{$path}'";

                            }

                        }

                    }

                }

                break;

            default:

                // TODO Maybe produce a warning?

        }

    }

}



查看完整回答
反对 回复 2022-01-08
  • 1 回答
  • 0 关注
  • 170 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信