【问题标题】:Composer is not autoloading my autoloader classComposer 没有自动加载我的自动加载器类
【发布时间】:2018-02-08 15:01:09
【问题描述】:

所以,我最近在我的 composer.json 文件中包含了一个私有包,并且工作正常。它根据我的需要克隆了我的 BitBucket 存储库的项目。但是,我在自动加载包的类时遇到了问题。

如果我在我的 Silex 项目的控制器中手动添加自动加载器,效果很好。

require_once('/var/www/vendor/my-vendor/my-private-package/autoload.php');

但是,如果我不添加 autoload.php 类,那么我会收到 class not found 的错误:

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/" }
    }
}

私有包中的类在 lib/ 子目录下。

顺便说一下,这个客户端是由 Swagger Editor 在线工具https://editor.swagger.io/自动生成的

【问题讨论】:

标签: php composer-php swagger autoload


【解决方案1】:

您在这里覆盖了您的作曲家中的根名称空间:

"autoload": {
  "psr-4": { "Swagger\\Client\\" : "lib/" }
}

注意您的错误:Uncaught Error: Class 'Swagger\Client\Api\MyPHPClientApi' not found

Composer 将您的依赖项安装在您的 vendor 文件夹中,但您告诉它在您的 lib 文件夹中查找 Swagger\Client\ 命名空间。

假设您的私人仓库遵循 PSR-4(可以安全地假设,因为您使用的是 PSR-4 自动加载器),您只需要在您的作曲家和 generate again the composer autoloader (composer dump-autoloader) 中删除这一行。

【讨论】:

  • 哇!这就是它正在发生的事情。问题是其他包,如 Silex 主包或 Twig,也有该自动加载部分。他们没有的是根文件夹的源目录中的 autoload.php。那么导致问题的原因是autoload.php。当我删除它时,一切正常。
猜你喜欢
  • 2017-06-13
  • 2016-04-17
  • 2019-01-22
  • 1970-01-01
  • 1970-01-01
  • 2014-09-17
  • 2020-01-21
  • 1970-01-01
  • 2017-09-02
相关资源
最近更新 更多