Class 在 Laravel 中自动加载后未找到

Class not found after auto loading in Laravel

我在 Laravel 5.4 中与 PHP NamespacesAuto loading 作斗争。我实际上决定将我需要使用的模型放在一个明确的命名文件夹中 app/Models:

php artisan make:model Models/Customer

我已将 Customer 模型的命名空间设置为 namespace Models;
然后,我创建了一个路由如下:

Route::get('customer', function () {
    $customer = \App\Models\Cutomer::find(1);
    echo $customer;
});


为了进行自动加载工作,我打开了位于 Laravel 项目根文件夹中的 composer.json 文件,并使 autoload 如下所示:

"autoload": {
    "classmap": [
        "database",
        "app/Models"
    ],
    "psr-4": {
        "App\": "app/",
        "App\Models\": "App/Models"
    }
},

完成所有这些之后,我检查了我的作曲家是否是更新版本并且 运行 dump-autoload:

composer self-update
composer dump-autoload -o

另外值得注意的是vendor/composer/autoload_classmap.php的内容:

'App\Models\Customer' => $baseDir . '/app/Models/Customer.php',
'App\Models\Test\Test' => $baseDir . '/app/Models/Test.php',

我的问题是,每当我执行 url: http://127.0.0.1:8000/customer 时,我都会遇到以下错误输出:

(1/1) FatalThrowableError
Class 'App\Models\Cutomer' not found

能否请您帮助我了解我的工作哪里不正确,以及如何解决?非常感谢您。

模型中的命名空间应为 namespace App\Model;(因此将 class 称为 \App\Models\Cutomer

当您使用 php artisan make:model Models/Customer 时,它应该已经正确设置了命名空间。

此外,您无需编辑 composer.json 即可执行此操作。删除您为自动加载对 composer.json 文件所做的添加,然后从命令行删除 运行 composer dumpautoload

希望对您有所帮助!

首先,您的 PSR-4 设置有误。

"App\Models\": "App/Models"

这没有映射到有效的目录。其次,更重要的是,无需自动加载已声明的嵌套命名空间。通过自动加载 App 你将已经自动加载任何嵌套的命名空间,只要它们符合 PSR-4 标准即命名空间作为目录名和文件名作为 class 名称。

Composer 设置只需如下:

"psr-4": {
    "App\": "app/"
}