cake加载供应商/作曲家/autoload_namespaces.php中未列出的作曲家包



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

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

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

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

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

use UploadHandler;
public function test()
{
var_dump(new 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()

你读过handler.php文件中的注释吗?

不要直接从客户端代码使用或引用它。相反,这应该通过端点.php或端点.php文件来要求

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

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

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

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

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

$ composer dump-autoload

参见

  • 作曲家文档> 作曲家.json 架构>自动加载>类映射
  • 作曲家文档> 命令行界面/>转储自动加载的命令

最新更新