2017-05-03 89 views
1

我有一个用CakePHP 3编写的应用程序。我已经通过Composer安装了Cake和其他软件包。加载供应商/作曲家/ autoload_namespaces.php中未列出的Composer软件包

最近的一次我安装了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

但是,如果我尝试引用,在我的蛋糕控制器之一,是这样的:

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()

回答

2

您是否阅读过handler.php文件中的注释?

请勿直接从您的客户端代码使用或引用它。相反,这应该通过endpoint.php或端点cors.php文件(S)

所以AFAICT包不定义任何自动加载capabilites,因为你不应该直接使用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 

又见

相关问题