我有一个用CakePHP 3编写的应用程序。我已经通过Composer安装了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
。
但是,如果我尝试在我的一个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()
这样的东西?
答案 0 :(得分:2)
您是否阅读了handler.php
文件中的说明?
请勿直接从客户端代码使用或引用此内容。相反,这应该通过endpoint.php或endpoint-cors.php文件
来实现
所以AFAICT包没有定义任何自动加载功能,因为您不应该直接使用UploadHandler
类,而是应该需要endpoint.php
或endpoint-cors.php
文件,不包括任何类,只应在需要时才需要。
当然这些端点文件与CakePHP不兼容,因此您可能有理由直接使用处理程序类。但是,程序包不使用名称空间,并且类名与文件名不匹配,即它既不遵循PSR-0也不遵循PSR-4约定,并且如前所述,程序包composer.json
未定义任何自动加载配置,所以无论程序包遵循什么约定,这都将导致程序包PHP类/文件没有自动加载功能。
因此,如果您需要自动加载功能,可以通过向项目classmap
添加composer.json
自动加载条目来解决此问题,例如:
{
"autoload": {
"classmap": [
"vendor/fineuploader/php-traditional-server/"
]
}
}
然后重新转储自动加载器,自动加载应该可以正常工作:
$ composer dump-autoload
另见