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

时间:2017-05-03 15:13:47

标签: php cakephp composer-php fine-uploader

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

我安装的最新版本是fineuploader/php-traditional-serverhttps://packagist.org/packages/fineuploader/php-traditional-server) 将其放入我的composer.json然后运行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'找不到

我能够完成上述操作的唯一方法是通过硬编码指向相应文件的链接。所以我没有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()这样的东西?

1 个答案:

答案 0 :(得分:2)

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

  

请勿直接从客户端代码使用或引用此内容。相反,这应该通过endpoint.php或endpoint-cors.php文件

来实现

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

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

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

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

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

$ composer dump-autoload

另见