加载未在 vendor/composer/autoload_namespaces.php 中列出的 Composer 包

Loading a Composer package not listed in vendor/composer/autoload_namespaces.php

我有一个用 CakePHP 3 编写的应用程序。我已经通过 Composer 安装了 Cake 和其他软件包。

我最近安装的是 fineuploader/php-traditional-server (https://packagist.org/packages/fineuploader/php-traditional-server) 把它放在我的 composer.json 然后 运行ning composer update:

 "require": {
    "fineuploader/php-traditional-server": "1.1.0"
 }

这已按预期将文件下载到 vendor/fineuploader/php-traditional-server

但是,如果我尝试在我的一个 Cake 控制器中引用它,如下所示:

use UploadHandler;

public function test()
{
    var_dump(new \UploadHandler);
}

错误提示 Class 'UploadHandler' not found

我能够将上述内容添加到 运行 的唯一方法是将 link 硬编码到适当的文件中。所以我有

而不是 use UploadHandler;
require_once(ROOT . DS . 'vendor/fineuploader/php-traditional-server/handler.php'); 

我在 https://jtreminio.com/2012/10/composer-namespaces-in-5-minutes/ 上读到 vendor/composer/autoload_namespaces.php 应该包含可以自动加载的命名空间。但是当我打开那个文件时,没有提到这个包(实际上只有大约 3 个,而我的 vendor 目录有大量的包,其中一些我可以很好地使用)。

那么加载UploadHandler的正确方法是什么?我认为使用 Composer 的意义在于它负责自动加载这些文件,因此您 不必 必须使用 require()?

之类的东西

您是否阅读了 handler.php 文件中的说明?

Do not use or reference this directly from your client-side code. Instead, this should be required via the endpoint.php or endpoint-cors.php file(s)

所以 AFAICT 包没有定义任何自动加载功能,因为你不应该直接使用 UploadHandler class,而是你应该需要 endpoint.phpendpoint-cors.php 文件,不包含任何 classes,只有在需要时才需要。

这些端点文件肯定与 CakePHP 不兼容,因此您可能有理由直接使用处理程序 class。然而,该包不使用命名空间,并且 class 名称与文件名不匹配,即它既不遵循 PSR-0 也不遵循 PSR-4 约定,并且如前所述,包 composer.json 不' 定义任何自动加载配置,因此无论包遵循什么约定,这都会导致包没有自动加载功能 PHP classes/files.

因此,如果您想要自动加载功能,您可以通过例如向项目 composer.json 添加 classmap 自动加载条目来解决此问题,例如:

{
    "autoload": {
        "classmap": [
            "vendor/fineuploader/php-traditional-server/"
        ]
    }
}

然后重新转储自动加载器,自动加载应该可以正常工作:

$ composer dump-autoload

另见