【问题标题】:Class file not found by composer and psr-4作曲家和 psr-4 找不到类文件
【发布时间】:2017-10-30 10:30:24
【问题描述】:

我很难理解如何使用 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.';
    }
}

但是,在尝试访问页面后,页面上显示的错误信息如下:

(!) 致命错误:未捕获的错误:在第 6 行的 /home/vagrant/web/sites/app/index.php 中找不到类 'app\folder\test'
( ! ) 错误:在第 6 行的 /home/vagrant/web/sites/app/index.php 中找不到类 'app\folder\test'

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

【问题讨论】:

    标签: php composer-php autoload


    【解决方案1】:

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

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

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

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

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

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

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

    【讨论】:

    • @以上亲爱的朋友:非常感谢您的帮助和关心。再次非常感谢你们。你拯救了我的一天,给我上了一课。
    【解决方案2】:

    要为您当前的设置修复它,请使用以下命令:

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

    您的 composer.json 位于 app 目录中,因此没有名为 app 的子目录可供参考。


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

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

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

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

    这可确保属于您的“应用”命名空间的所有文件都包含在单个子目录中。


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

    【讨论】:

      【解决方案3】:

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

      classmap参数举例:

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

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

      希望这会有所帮助。

      【讨论】:

      • 只是一个更新......如果你不想在上面做,你可以运行 composer dump-autoload -a
      【解决方案4】:

      在composer.json中尝试设置

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

      然后执行这个命令

      composer dump-autoload -o
      

      【讨论】:

      • 感谢您的回复,但它也不起作用。
      猜你喜欢
      • 2020-05-30
      • 2017-01-02
      • 2019-01-31
      • 2017-05-16
      • 2018-09-03
      • 2016-10-24
      • 2014-01-10
      • 1970-01-01
      • 2016-03-31
      相关资源
      最近更新 更多