Class composer 和 psr-4 找不到文件

Class file not found by composer and psr-4

我很难理解如何通过 psr-4 使用自动加载。
加载 vagrant 并设置和测试 Homestead.yaml 中的所有变量后,我准备了一个文件结构作为以下:

\app
   \folder
      -- test.php
   \vendor
       \composer
       -- autoload.php
   -- index.php
   -- composer.json

以下是我的代码:

index.php

<?PHP 
namespace app;

require('vendor/autoload.php');

$object = new folder\test();

composer.json

"autoload":{
    "psr-4":{
        "app\": "app"
    }
}

test.php

<?php 
namespace app\folder;

class test 
{
    function __construct ()
    {
        echo 'construction done right.';
    }
}

但是,在尝试访问该页面后,页面上显示了以下错误消息:

(!) Fatal error: Uncaught Error: Class 'app\folder\test' not found in /home/vagrant/web/sites/app/index.php on line 6
( ! ) Error: Class 'app\folder\test' not found in /home/vagrant/web/sites/app/index.php on line 6

你能帮我理解并修复这个错误吗?

在composer.json中尝试设置

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

然后执行这个命令

composer dump-autoload -o

它不起作用,因为您已经告诉 Composer app 命名空间中的 类 在 app 子目录中,但没有 app 子目录。

整个应用程序都存储在 app 目录中,它的名称对于应用程序来说并不重要。 app命名空间的类存放在当前目录下,子命名空间存放在同名子目录下。

因此,您的 composer.json 文件应为:

"autoload": {
    "psr-4": {
        "app\": ""
    }
}

或者,为了更清楚,您可以将 .(当前目录)作为 app\ 命名空间的位置:

"autoload": {
    "psr-4": {
        "app\": "."
    }
}

在主应用程序目录中进行更改 运行 composer dump-autoloader 后,它将开始工作。

要针对您当前的设置修复它,请使用以下方法:

"autoload":{
    "psr-4":{
        "app\": ""
    }
}

您的 composer.json 在应用程序目录中,因此没有名为 app 的子目录可供参考。


我实际上建议将您的目录结构更改为以下内容:

  \app
     \src
     \folder
       -- test.php
       -- index.php
     \vendor
       \composer
         -- autoload.php
     -- index.php
     -- composer.json

然后在composer.json中设置如下:

"autoload":{
    "psr-4":{
        "app\": "src"
    }
}

这确保属于您的 'app' 命名空间的所有文件都包含在一个子目录中。


最后,我建议您使用供应商命名空间来防止冲突,并使用 PSR-2 中的命名指南。

我认为您不需要 PSR-4 只需添加 classmap

classmap 参数例如:

"autoload": {        
    "classmap": [
        "app"
    ]
}

添加此 运行 composer dump-autoload 后,您应该会看到添加了一些 类。

希望对您有所帮助。