我在PHP Namespaces
中与Auto loading
和Laravel 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
请您帮我理解我的工作在哪里不正确,以及如何解决?非常感谢你提前。
答案 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/"
}