没有作曲家的 PSR 4 自动加载

PSR4 auto load without composer

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

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

现在我将其复制到另一个未使用 Composer 的项目中。我怎样才能在那里自动加载同一个包?

您必须自己阅读作曲家并为 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 CompanyName\PackageName\Test();

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

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

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

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

是的,这个问题已有 6 个月之久,但我只是使用了以下内容。 我刚刚找到了以下解决问题的方法。我只是在本地 运行 我的项目文件夹中的命令 composer dump-autoload -o。之后,我只需要将 ./vendor/composer 文件夹和 /vendor/autoload.php 文件夹的内容上传到服务器,它又可以工作了。 如果您无法在服务器上 运行 作曲家,这将很有帮助。

出于很多原因,我不是 Composer 的粉丝。第一个原因共享托管服务不提供作曲家作为一个包,因此它使得交付低预算应用程序或简单的 MVC 自定义框架变得更加困难。这是一个符合 PSR4 标准的解决方法。

假设您将此 auto-load 方法添加到根目录中的文件中,并且我们正在 auto-loading 类 文件夹中名为“src”的所有内容这里是如何存档。

define('ROOT', dirname(__DIR__));
define('SLASH', DIRECTORY_SEPARATOR);

spl_autoload_register(function ($className) 
{
    $fileName = sprintf("%s%ssrc%s%s.php", ROOT, SLASH, SLASH, str_replace("\", "/", $className));

    if (file_exists($fileName)) 
    {
        require ($fileName);
    } 
    else 
    {
        echo "file not found {$fileName}";
    }
});

现在您应该在每个文件中添加一个命名空间,如果您有依赖项,请使用。这是

中的一个基本示例
namespace myapp;
use Core\Example;

此外,在我的示例中,src 中的所有文件夹都应以大写字母开头。

完成。干杯@jerryurenaa