![](/img/trans.png)
[英]Composer does not generate autoloader information (autoload_namespaces.php)
[英]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
然后运行composer update
:
"require": {
"fineuploader/php-traditional-server": "1.1.0"
}
这已按预期将文件下载到vendor/fineuploader/php-traditional-server
。
但是,如果我尝试在我的一个Cake Controller中引用它,如下所示:
use UploadHandler;
public function test()
{
var_dump(new \UploadHandler);
}
错误提示未找到类“ 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
文件中的注释?
不要直接从客户端代码中使用或引用它。 相反,这应该通过endpoint.php或endpoint-cors.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
也可以看看
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.