PSR4 无需作曲家自动加载 [英] PSR4 auto load without composer

查看:28
本文介绍了PSR4 无需作曲家自动加载的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在一个使用 composer 和 composer.json 条目自动加载的项目中有一个包如下:

I have one package in a project which is autoloaded using composer and composer.json entry is as follows :

 "autoload": {
      "psr-4": {
        "CompanyName\PackageName\": "packages/package-folder/src/"
    }
  }

现在我将它复制到另一个不使用作曲家的项目中.我如何在那里自动加载同一个包?

Now I am copying this over to another project which is not using composer. How can I autoload this same package there ?

推荐答案

您必须阅读 Composer 并为定义到 composer.json 中的每个命名空间自己加载类.

You have to read the composer and load the classes yourself for each namespaces defined into the composer.json.

方法如下:

function loadPackage($dir)
{
    $composer = json_decode(file_get_contents("$dir/composer.json"), 1);
    $namespaces = $composer['autoload']['psr-4'];

    // Foreach namespace specified in the composer, load the given classes
    foreach ($namespaces as $namespace => $classpaths) {
        if (!is_array($classpaths)) {
            $classpaths = array($classpaths);
        }
        spl_autoload_register(function ($classname) use ($namespace, $classpaths, $dir) {
            // Check if the namespace matches the class we are looking for
            if (preg_match("#^".preg_quote($namespace)."#", $classname)) {
                // Remove the namespace from the file path since it's psr4
                $classname = str_replace($namespace, "", $classname);
                $filename = preg_replace("#\\#", "/", $classname).".php";
                foreach ($classpaths as $classpath) {
                    $fullpath = $dir."/".$classpath."/$filename";
                    if (file_exists($fullpath)) {
                        include_once $fullpath;
                    }
                }
            }
        });
    }
}

loadPackage(__DIR__."/vendor/project");

new CompanyNamePackageNameTest();

当然,我不知道你在 PackageName 中的类./vendor/project 是您的外部库的克隆或下载位置.这是您拥有 composer.json 文件的地方.

Of course, I don't know the classes you have in the PackageName. The /vendor/project is where your external library was cloned or downloaded. This is where you have the composer.json file.

注意:这仅适用于 psr4 自动加载.

Note: this works only for psr4 autoload.

编辑:为一个命名空间添加对多个类路径的支持

EDIT : Adding support for multiple classpaths for one namespace

EDIT2 :我创建了一个 Github repo 来处理这段代码,如果有人想改进它.

EDIT2 : I created a Github repo to handle this code, if anyone wants to improve it.

这篇关于PSR4 无需作曲家自动加载的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆