在 Laravel 中无法自动加载 psr-4

Posted

技术标签:

【中文标题】在 Laravel 中无法自动加载 psr-4【英文标题】:having trouble psr-4 autoloading in Laravel 【发布时间】:2014-07-18 01:41:12 【问题描述】:

好的,我的 Laravel 应用程序中有一个项目文件夹。命名为 TLGD(如果我的站点的名称)。在里面我创建了一个表单验证助手,用于从控制器中删除不必要的代码。

这是文件夹结构:

TGLD\Validation\Forms

在里面我有我的表单助手类

现在在控制器中只是为了测试它,我通过 php 中的 use methd 调用类,如下所示:

use TGLD\Validation\Forms\Login;

login 是登录验证的类

现在效果很好,所以我尝试自动加载 TGLD 文件夹,这样我就不需要在每个控制器中添加使用行。这是我的 composer.json 文件

"autoload": 
    "classmap": [
        "app/commands",
        "app/controllers",
        "app/models",
        "app/database/migrations",
        "app/database/seeds",
        "app/tests/TestCase.php"
    ],
    "psr-4": 
        "TGLD\\": "app/TGLD"
    
,

但是当我自动加载它时,它给了我我的登录类不存在的错误,这意味着自动加载器不工作。有语法错误还是我遗漏了什么?我跑了

composer dump-autoload -o

任何建议都是有帮助的,提前谢谢你

【问题讨论】:

自动加载!= use。您仍然需要使用use 语句。你可以做的是为你的表单验证器设置一个别名,但我不会这样做。 没有其他方法可以做到,所以我不需要要求所有 y 控制器都使用? 都是关于命名空间php.net/manual/en/language.namespaces.php,所以基本上没有。您可以在 app/config/app.php 中为您的 Laravel 应用程序设置别名,但就像我说的,我不会那样做。 【参考方案1】:

你想做的事是做不到的。

您必须在某处使用完整的命名空间来标识您要使用的类。你有几个选择来做到这一点

    使用具有如下命名空间的类的完全限定名称:new \TGLD\Validation\Forms\Login()。 使用use 子句将命名类导入此文件的当前命名空间use TGLD\Validation\Forms\Login; ... new Login();use中使用命名空间的一部分,在类名中使用其余部分:use TGLD\Validation\Forms; ... new Forms\Login();

在您以一种或另一种方式选择类名后,PHP 知道它需要哪个类,然后如果 PHP 仍然不知道该类,则触发自动加载。

所以你不能通过自动加载来影响类的命名。

【讨论】:

以上是关于在 Laravel 中无法自动加载 psr-4的主要内容,如果未能解决你的问题,请参考以下文章

PSR-4 和类图自动加载的区别?

psr-0 与作曲家自动加载不工作,但它与 psr-4 自动加载完美配合

作曲家自动加载 Laravel 5.5

找不到作曲家phpunit psr-4自动加载类

使用 Composer 自动加载 PSR-4

如何为我的项目创建 PSR-4 自动加载器?