Composer autoload classmap with key value for class name with non-matching filename

Composer autoload classmap with key value for class name with non-matching filename

由于遗留问题,我有一个带有自动加载器的 CMS。 Composer 加入了管理一些依赖项以简化支付集成的聚会。但是,我发现这两个自动加载器相互冲突。然后我发现我可以在 composer.json 中使用 classmap,但这似乎无法解决我的问题 - 找不到请求的 class。

例如,我有一个 MySQL class,它位于一个名为 Database.php 的文件中。使用 classmap 到目前为止,当我在其中输入 Database.php 的文件路径时,我无法正确加载 MySQL class。但是,使用 files 容器它可以工作。但是,如果可能的话,我想防止暴力包含每个页面请求的所有遗留 classes。

我想知道是否可以为类似 classmap 的行为定义键值映射。从而定义我的 composer.json 类似:

{
   "require" : {
     "vendor/payment-service-provider-package": "version-data"
   },
   "autoload": {
     "classmap": [
       "MySQL" => "./CMS/Classes/Database.php",
       "..." => "./CMS/Classes/....php"
     ]
   }
}

您只需声明声明 classes 的文件,生成的 自动加载程序将创建必要的“键值”映射。

例如我在 lib/ 上有几个声明 classes 将在 PSR-4 之外的文件:

  • FooBar.php 声明 \Foo\Bar.
  • FizzBuzz.php 声明 \Extra\Fizz\Extra\Buzz.

此外,在 src/ 内,我有其余的 classes,遵循 PSR-4 标准。

为了在自动加载时包含所有这些 classes,我简单地声明:

{
  "autoload": {
    "psr-4": {
      "App\": "src"
    },
    "classmap": [
      "lib/"
    ]
  }
}

在 运行 composer dump-autoload 之后,composer 将扫描这些目录并在 vendor/composer/autoload_classmap.php 我会得到:

<?php

// autoload_classmap.php @generated by Composer

$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);

return array(
    'Bar' => $baseDir . '/lib/FooBar.php',
    'Composer\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php',
    'Extra\Buzz' => $baseDir . '/lib/FizzBuzz.php',
    'Extra\Fizz' => $baseDir . '/lib/FizzBuzz.php',
    'Foo' => $baseDir . '/lib/FooBar.php',
);

... 包括所有必要的信息,以了解每个“未找到”需要读取哪个文件 class。