我有一个用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.php
或endpoint-cors.php
文件,该文件不包含任何类,并且应该只在需要时需要。
当然,这些端点文件与 CakePHP 不兼容,因此您可能有理由直接使用处理程序类。然而,该包不使用命名空间,并且类名与文件名不匹配,即它既不遵循 PSR-0 也不遵循 PSR-4 约定,并且如前所述,包composer.json
没有定义任何自动加载配置,因此无论包遵循什么约定,这都会导致包 PHP 类/文件没有自动加载功能。
因此,如果您想要自动加载功能,您可以通过例如向项目composer.json
添加classmap
自动加载条目来解决此问题,例如:
{
"autoload": {
"classmap": [
"vendor/fineuploader/php-traditional-server/"
]
}
}
然后重新转储自动加载器,自动加载应该可以正常工作:
$ composer dump-autoload
参见
- 作曲家文档> 作曲家.json 架构>自动加载>类映射
- 作曲家文档> 命令行界面/>转储自动加载的命令