Изменение папки и пространства имен для моделей в Laravel 7
2019-09-14 13:14:07
По умолчанию классы моделей в Laravel 7 и Laravel 6 расположены в корне папки приложения: app и имеют пространство имен App. Это не очень хорошо с точки зрения структуры. Рекомендую по аналогии с контроллерами вынести модели в папку "app/Models", предварительно создав её, и использовать пространство имён "App/Models".
Для осуществения этих изменений потребуется:
- переместить все файлы классов с моделиями в созданную папку;
- изменить у них namespace;
- внести изменения в логику класса ModelMakeCommand, расширив его и переорпеделив метод getDefaultNamespace. Затем прописать его в ServiceProvider.
- если у вас сгенерирована модель User и логика аутентификации, нужно адаптировать её код под новые условия.
Перемещение файлов и изменение namespace
Перемещаем все модели из папки app в папку app/Models.
Меняем "namespace App;" на namespace "App\Models;".
Кроме того, во всех файлах проекта, где используются данные классы моделей нужно заменить строки с указанием пространств имен используемых классов, например для модели User "use App/User;" на "use App/Models/User;".
Автоматическая генерация моделей в папке app/Models
При генерации модели с помощью Artisan, файл с моделью создасться в папке app и внём выставиться namespace App. Чтобы генератор создавал файл с классом в папке app/Models нужно внести изменения, описанные ниже.
Используя механизм наследования, расширим класс ModelMakeCommand и переопределим метод, отвечающий за возвращение значения namespace для генератора. Для этого, создадим файл "app/Console/Commands/ModelMakeCommand.php" со следующим содержимым:
<?php
namespace App\Console\Commands;
use Illuminate\Foundation\Console\ModelMakeCommand as Command;
class ModelMakeCommand extends Command
{
/**
* Get the default namespace for the class.
*
* @param string $rootNamespace
* @return string
*/
protected function getDefaultNamespace($rootNamespace)
{
return "{$rootNamespace}\Models";
}
}
Проверим результат, выполнив команду "php artisan make:model Test" в терминале. Убедитесь, что файл с классом, реализующем модель, создался в нужном месте и имеет верный namespace.
Корректировка файлов аутентификации, использующих модель User
Если вы добавили через artisan механизм аутентификации в ваш проект, после изменения пространства имен потребуются следующие изменения.
В контроллере "app/Http/Controllers/Auth/RegisterController.php" заменить "use App\User;" на "use App\Models\User;".
В файле "config/auth.php" в элементе массива providers пропишите класс с новым namespace:
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\Models\User::class,
],
],