在Laravel中自动加载后找不到类

时间:2017-07-13 15:22:29

标签: php laravel namespaces autoload

我在PHP Namespaces中与Auto loadingLaravel 5.4进行斗争。我实际上决定将我需要使用的模型放在一个明确的命名文件夹中app/Models

php artisan make:model Models/Customer

我已将客户模型的命名空间设置为namespace Models;
然后,我创建了一条路线如下:

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


要执行自动加载工作,我打开了位于composer.json项目的根文件夹中的Laravel文件,并使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

请您帮我理解我的工作在哪里不正确,以及如何解决?非常感谢你提前。

2 个答案:

答案 0 :(得分:1)

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

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

此外,您不需要编辑composer.json来执行此操作。删除您对composer.json文件进行自动加载的附加内容,然后从命令行运行composer dumpautoload

希望这有帮助!

答案 1 :(得分:1)

首先,您的PSR-4设置出错。

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

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

作曲家设置只需要如下:

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