加载未在 vendor/composer/autoload_namespaces.php 中列出的 Composer 包
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
然后 运行ning 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' not found
我能够将上述内容添加到 运行 的唯一方法是将 link 硬编码到适当的文件中。所以我有
而不是 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
文件中的说明?
Do not use or reference this directly from your client-side code. Instead, this should be required via the endpoint.php or endpoint-cors.php file(s)
所以 AFAICT 包没有定义任何自动加载功能,因为你不应该直接使用 UploadHandler
class,而是你应该需要 endpoint.php
或 endpoint-cors.php
文件,不包含任何 classes,只有在需要时才需要。
这些端点文件肯定与 CakePHP 不兼容,因此您可能有理由直接使用处理程序 class。然而,该包不使用命名空间,并且 class 名称与文件名不匹配,即它既不遵循 PSR-0 也不遵循 PSR-4 约定,并且如前所述,包 composer.json
不' 定义任何自动加载配置,因此无论包遵循什么约定,这都会导致包没有自动加载功能 PHP classes/files.
因此,如果您想要自动加载功能,您可以通过例如向项目 composer.json
添加 classmap
自动加载条目来解决此问题,例如:
{
"autoload": {
"classmap": [
"vendor/fineuploader/php-traditional-server/"
]
}
}
然后重新转储自动加载器,自动加载应该可以正常工作:
$ composer dump-autoload
另见
我有一个用 CakePHP 3 编写的应用程序。我已经通过 Composer 安装了 Cake 和其他软件包。
我最近安装的是 fineuploader/php-traditional-server
(https://packagist.org/packages/fineuploader/php-traditional-server)
把它放在我的 composer.json
然后 运行ning 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' not found
我能够将上述内容添加到 运行 的唯一方法是将 link 硬编码到适当的文件中。所以我有
而不是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
文件中的说明?
Do not use or reference this directly from your client-side code. Instead, this should be required via the endpoint.php or endpoint-cors.php file(s)
所以 AFAICT 包没有定义任何自动加载功能,因为你不应该直接使用 UploadHandler
class,而是你应该需要 endpoint.php
或 endpoint-cors.php
文件,不包含任何 classes,只有在需要时才需要。
这些端点文件肯定与 CakePHP 不兼容,因此您可能有理由直接使用处理程序 class。然而,该包不使用命名空间,并且 class 名称与文件名不匹配,即它既不遵循 PSR-0 也不遵循 PSR-4 约定,并且如前所述,包 composer.json
不' 定义任何自动加载配置,因此无论包遵循什么约定,这都会导致包没有自动加载功能 PHP classes/files.
因此,如果您想要自动加载功能,您可以通过例如向项目 composer.json
添加 classmap
自动加载条目来解决此问题,例如:
{
"autoload": {
"classmap": [
"vendor/fineuploader/php-traditional-server/"
]
}
}
然后重新转储自动加载器,自动加载应该可以正常工作:
$ composer dump-autoload
另见