Изменение папки и пространства имен для моделей в Laravel 6

2019-09-14 15:14:07


По умолчанию классы моделей в Laravel 6 расположены в корне папке приложения: app и имеют пространство имен App. Это не очень хорошо с точки зрения структуры. Рекомендую по аналогии с контроллерами вынести модели в папку "app/Models", предварительно создав её, и использовать пространство имён  "App/Models".

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

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

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

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

Models Laravel 6

Меняем "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" со следующим содержимым:


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";
    }
}

Далее, в AppServiceProvider нам надо указать, чтоб генератор использовал наш класс ModelMakeCommand для генератора:


namespace App\Providers;

use App\Console\Commands\ModelMakeCommand;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        $this->app->extend('command.model.make', function ($command, $app) {
            return new ModelMakeCommand($app['files']);
        });
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }
}

Проверим результат, выполнив команду "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,
    ],
],