Composer 没有自动加载我的自动加载器 class
Composer is not autoloading my autoloader class
所以,我最近在我的 composer.json 文件中包含了一个私人包,并且工作正常。它按照我的意愿克隆了我的 BitBucket 存储库的项目。但是,我在自动加载包的 classes 时遇到问题。
如果我在我的 Silex 项目的控制器中手动添加自动加载器,效果很好。
require_once('/var/www/vendor/my-vendor/my-private-package/autoload.php');
但是,如果我不添加 autoload.php class,则会出现 class 未找到的错误:
18/02/07 17:05:33 [error] 1174#0: *1187 FastCGI sent in stderr: "PHP message: PHP Fatal error: Uncaught Error: Class 'Swagger\Client\Api\MyPHPClientApi' not found in /vagrant/public/personal-project/src/App/Frontal/Controller/MyController.php:88
Stack trace:
#0 /vagrant/public/personal-project/vendor/symfony/http-kernel/HttpKernel.php(151): App\Frontal\Controller\SleepingPlaceController->showList()
#1 /vagrant/public/personal-project/vendor/symfony/http-kernel/HttpKernel.php(68): Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object(Symfony\Component\HttpFoundation\Request), 1)
#2 /vagrant/public/personal-project/vendor/silex/silex/src/Silex/Application.php(496): Symfony\Component\HttpKernel\HttpKernel->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#3 /vagrant/public/personal-project/vendor/silex/silex/src/Silex/Application.php(477): Silex\Application->handle(Object(Symfony\Component\HttpFoundation\Request))
#4 /vagrant/public/personal-project/web/index.php(10): Silex\Application->run()
#5 {main}
那我做错了什么?
我的私有包的composer.json是这样的:
{
"name": "my-vendor/my-private-package",
"description": "",
"keywords": [
"swagger",
"php",
"sdk",
"api"
],
"homepage": "http://swagger.io",
"license": "proprietary",
"authors": [
{
"name": "Swagger and contributors",
"homepage": "https://github.com/swagger-api/swagger-codegen"
}
],
"require": {
"php": ">=5.4",
"ext-curl": "*",
"ext-json": "*",
"ext-mbstring": "*"
},
"require-dev": {
"phpunit/phpunit": "~4.8",
"satooshi/php-coveralls": "~1.0",
"squizlabs/php_codesniffer": "~2.6",
"friendsofphp/php-cs-fixer": "~1.12"
},
"autoload": {
"psr-4": { "Swagger\Client\" : "lib/" }
},
"autoload-dev": {
"psr-4": { "Swagger\Client\" : "test/" }
}
}
私有包中的class在lib/子目录下
顺便说一下,这个客户端是由 Swagger Editor 在线工具自动生成的 https://editor.swagger.io/
您正在此处覆盖您的作曲家的根名称 space:
"autoload": {
"psr-4": { "Swagger\Client\" : "lib/" }
}
注意你的错误:Uncaught Error: Class 'Swagger\Client\Api\MyPHPClientApi' not found
Composer 在您的 vendor
文件夹中安装您的依赖项,但您告诉它在您的 lib
文件夹中查找 Swagger\Client\
名称space。
假设你的私人仓库遵循 PSR-4(这是安全的假设,因为你使用的是 PSR-4 自动加载器),你只需要在你的作曲家和 generate again the composer autoloader(composer dump-autoloader
).
所以,我最近在我的 composer.json 文件中包含了一个私人包,并且工作正常。它按照我的意愿克隆了我的 BitBucket 存储库的项目。但是,我在自动加载包的 classes 时遇到问题。
如果我在我的 Silex 项目的控制器中手动添加自动加载器,效果很好。
require_once('/var/www/vendor/my-vendor/my-private-package/autoload.php');
但是,如果我不添加 autoload.php class,则会出现 class 未找到的错误:
18/02/07 17:05:33 [error] 1174#0: *1187 FastCGI sent in stderr: "PHP message: PHP Fatal error: Uncaught Error: Class 'Swagger\Client\Api\MyPHPClientApi' not found in /vagrant/public/personal-project/src/App/Frontal/Controller/MyController.php:88
Stack trace:
#0 /vagrant/public/personal-project/vendor/symfony/http-kernel/HttpKernel.php(151): App\Frontal\Controller\SleepingPlaceController->showList()
#1 /vagrant/public/personal-project/vendor/symfony/http-kernel/HttpKernel.php(68): Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object(Symfony\Component\HttpFoundation\Request), 1)
#2 /vagrant/public/personal-project/vendor/silex/silex/src/Silex/Application.php(496): Symfony\Component\HttpKernel\HttpKernel->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#3 /vagrant/public/personal-project/vendor/silex/silex/src/Silex/Application.php(477): Silex\Application->handle(Object(Symfony\Component\HttpFoundation\Request))
#4 /vagrant/public/personal-project/web/index.php(10): Silex\Application->run()
#5 {main}
那我做错了什么?
我的私有包的composer.json是这样的:
{
"name": "my-vendor/my-private-package",
"description": "",
"keywords": [
"swagger",
"php",
"sdk",
"api"
],
"homepage": "http://swagger.io",
"license": "proprietary",
"authors": [
{
"name": "Swagger and contributors",
"homepage": "https://github.com/swagger-api/swagger-codegen"
}
],
"require": {
"php": ">=5.4",
"ext-curl": "*",
"ext-json": "*",
"ext-mbstring": "*"
},
"require-dev": {
"phpunit/phpunit": "~4.8",
"satooshi/php-coveralls": "~1.0",
"squizlabs/php_codesniffer": "~2.6",
"friendsofphp/php-cs-fixer": "~1.12"
},
"autoload": {
"psr-4": { "Swagger\Client\" : "lib/" }
},
"autoload-dev": {
"psr-4": { "Swagger\Client\" : "test/" }
}
}
私有包中的class在lib/子目录下
顺便说一下,这个客户端是由 Swagger Editor 在线工具自动生成的 https://editor.swagger.io/
您正在此处覆盖您的作曲家的根名称 space:
"autoload": {
"psr-4": { "Swagger\Client\" : "lib/" }
}
注意你的错误:Uncaught Error: Class 'Swagger\Client\Api\MyPHPClientApi' not found
Composer 在您的 vendor
文件夹中安装您的依赖项,但您告诉它在您的 lib
文件夹中查找 Swagger\Client\
名称space。
假设你的私人仓库遵循 PSR-4(这是安全的假设,因为你使用的是 PSR-4 自动加载器),你只需要在你的作曲家和 generate again the composer autoloader(composer dump-autoloader
).