Изменение папки для моделей

По умолчанию классы моделей в Laravel 7 и Laravel 6 расположены в корне папки приложения: app и имеют пространство имен App.

Рекомендую по аналогии с контроллерами вынести модели в папку "app/Models", предварительно создав её, и использовать пространство имён  "App/Models".

Для осуществления этих изменений потребуется:

  1. переместить все файлы классов с моделями в созданную папку;
  2. изменить у них namespace;
  3. внести изменения в логику класса ModelMakeCommand, расширив его и переопрпеделив метод getDefaultNamespace. Затем прописать его в  ServiceProvider.
  4. если у вас сгенерирована модель User и логика аутентификации, нужно адаптировать её код под новые условия.


Перемещение файлов и изменение namespace

Перемещаем все модели из папки app  в папку app/Models.

Меняем "namespace App;" на namespace "App\Models;".

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use App\Models\User;
use Illuminate\Foundation\Auth\RegistersUsers;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
class RegisterController extends Controller

Кроме того, во всех файлах проекта, где используются данные классы моделей нужно заменить строки с указанием пространств имен используемых классов, например для модели 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,
],
],