繁体   English   中英

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

以下是我的代码:

索引.php

<?PHP 
namespace app;

require('vendor/autoload.php');

$object = new folder\test();

作曲家.json

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

测试文件

<?php 
namespace app\folder;

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

但是,在尝试访问该页面后,这些是页面上显示的错误消息:

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

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

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

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

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


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

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

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

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

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

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

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

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

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

classmap参数例如:

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

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

希望这会有所帮助。

在 composer.json 中尝试设置

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

然后执行此命令

composer dump-autoload -o

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM