作曲家psr-4自动加载有什么问题?

时间:2019-05-03 13:13:58

标签: composer-php autoloader

我正在使用Slim和Twig创建一个Web应用程序。我使用的库运行完美,我可以毫无问题地轻松调用它们。但是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中的文件夹名称中添加“ /”不会改变任何内容。

2 个答案:

答案 0 :(得分:0)

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

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);
    }
}

我将从这个功能基础上开始工作,看看是否可以获得我想要的结果。如果可以,我将编辑此答案。

答案 1 :(得分:0)

确保您的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/