【问题标题】:What is wrong in my composer psr-4 autoload?我的作曲家 psr-4 自动加载有什么问题?
【发布时间】:2019-09-22 01:06:31
【问题描述】:

我正在使用 Slim 和 Twig 创建一个网络应用程序。我使用的库完美运行,我可以轻松调用它们而没有问题。但是 composer.json 自动加载 psr-4 找不到我自己的类(psr-0 也找不到它们)
这是我的文件系统:

project
   |composer.json
   |src
       |public
       |   |index.php
       |classes
       |   |Application.php
       |   |middlewares
       |       |SecurityMiddleware.php
       |templates
           |TemplateController.php
           |main
               |MainController.php

这是我的composer.json

{
    "authors": [
        {
            "name": "Jean-Marc ZIMMER",
            "email": "################@gmail.com",
            "role": "Developer"
        }
    ],
    "require": {
        "slim/slim": "^3.11",
        "slim/extras": "*",
        "twig/twig": "^2.5",
        "slim/twig-view": "^2.4",
        "slim/views": "^0.1.3"
    },
    "autoload": {
        "psr-4": {
            "src\\": "src",
            "middlewares\\": "src/classes/middlewares",
            "classes\\": "src/classes",
            "templates\\": "src/templates"
        }
    }
}

然后src/classes/Application.php:

<?php

namespace classes;

class Application extends \Slim\App {

    public function __construct($container = array()) {
        parent::__construct($container);
    }
}

最后是我的index.php 文件:

<?php

require '../../vendor/autoload.php';

$app = new \classes\Application([
    "settings" => [
        "displayErrorDetails" => true
    ]
]);
$app->run();

当我运行composer dump-autoload 时,命令输出:

生成的包含 0 个类的自动加载文件

然后以状态码 0 退出。它应该找到 4 个类,对吧?
运行应用程序显示错误:

致命错误:未捕获的错误:在 /opt/lampp/htdocs/project/src/public/index.php:5 中找不到类“classes\Application”

我确定我遗漏了一些东西,表示命名空间或其他东西。谁能帮帮我?

编辑:
我尝试使用 --optimize 或 --classmap-authoritative 选项进行转储自动加载。什么都没改变。
向 composer.json 中的文件夹名称添加“/”不会改变任何内容。

【问题讨论】:

  • 您是否尝试使用/ 完成所有文件夹名称?这是我看到自己的代码的唯一区别
  • NicoHaase 没有改变任何东西。
  • src/classes/Application.php 长什么样子?
  • 你能运行composer dump-autoload --classmap-authoritative吗?这应该会给您预期的结果。现在它不会单独读取文件,只会注册目录映射。
  • 我用空的类骨架创建了相同的文件夹结构,它对我有用。请参阅:imgur.com/a/xM0X5r9 您能否展示完整的 composer.json?也许这可以帮助确定问题

标签: composer-php autoloader


【解决方案1】:

我从另一个来源获得了解决方案。我个人不喜欢它,但它有效。
文件系统没有改变。

composer.json自动加载:

"autoload": {
    "psr-4": {
        "App\\": "src/"
    }
}

src/public/index.php:

<?php

require '../../vendor/autoload.php';

$app = new \App\classes\Application([
    "settings" => [
        "displayErrorDetails" => true
    ]
]);
$app->run();

src/classes/Application.php:

<?php
namespace App\classes;

class Application extends \Slim\App {

    public function __construct($container = array()) {
        parent::__construct($container);
    }
}

我将从这个功能基础开始工作,看看我是否能得到我想要的结果。如果我这样做,我会编辑这个答案。

【讨论】:

    【解决方案2】:

    确保您的 composer.json 引用您的部署路径。例如:

    Dockerfile

    FROM php:7.2-apache
    
    COPY src /var/www/html
    COPY vendor /var/www/vendor
    

    composer.json

    {
      "autoload": {
        "psr-4": {
          "Acme\\": "html/classes/"
        }
      }
    }
    

    html/classes/ 不是 src/classes/

    【讨论】:

    • 如果我回到这个项目,我会试试这个。 (是的,这是我可能永远不会完成的副业之一......)
    • 你刚刚救了我
    猜你喜欢
    • 1970-01-01
    • 2017-01-27
    • 2016-03-31
    • 2016-10-24
    • 2017-01-02
    • 2017-07-15
    • 2019-01-31
    • 2017-06-23
    • 2016-10-31
    相关资源
    最近更新 更多