Слава Україні!

Laravel 9. Модули и маршрутизация

Создание и настройка модулей, кроссдоменная маршрутизация
5-го лютого 2022, 9:55

Продолжаем работать с проектом. Создадим модули и настроим их как поддомены с помощью маршрутизации.

Для комфортной работы с поддоменами в OS Windows возможно понадобится что-нибудь посерьезней, чем встроенный в Laravel сервер. Как вариант можно использовать XAMPP или OpenServer

Поддомены и модули

Пусть наш проект будет иметь, кроме основного домена, еще два поддомена. Например на основном домене (laravel.loc) можно разместить интернет-магазин. На поддомене blog.laravel.loc размещать статьи. Ну и конечно же админка - admin.laravel.loc - куда же без нее. На самом же деле этим можно не ограничиваться и пойти гораздо дальше. Сделать, например, модуль личного кабинета покупателей, модуль управления продажами для менеджеров и т.д.

Генерируем модули


php artisan module:make Blog

После выполнения команды, в папке Modules, будет создан модуль Blog со следующей структурой:


Modules/
    ├── Blog/
        ├── Config/
        ├── Console/
        ├── Database/
            ├── factories/
            ├── Migrations/
            ├── Seeders/
        ├── Entities/
        ├── Http/
            ├── Controllers/
            ├── Middleware/
            ├── Requests/
        ├── Providers/
            ├── BlogServiceProvider.php
            ├── RouteServiceProvider.php
        ├── Resources/
            ├── assets/
            ├── lang/
            ├── views/
        ├── Routes/
            ├── api.php
            ├── web.php
        ├── Tests/
        ├── composer.json
        ├── module.json
        ├── package.json
        ├── webpack.mix.js

Как видим, модуль представляет собой почти полноценное самостоятельное приложение со своими классами, ресурсами и конфигами. То что нам нужно. Проверим работу модуля. Зайдем по адресу http://laravel.loc/blog . Должны увидеть что-то подобное

Hello World

This view is loaded from module: Blog

Аналогично создаем модуль для админки - Admin.

Маршрутизация

Нам необходимо чтобы каждый поддомен обращался к своему модулю. Для этого внесем изменим в метод boot() класса RouteServiceProvider (app/Providers/RouteServiceProvider.php)


class RouteServiceProvider extends ServiceProvider
{
    protected $namespace = 'App\Http\Controllers';

    ...

    public function boot()
    {
        $this->configureRateLimiting();

        $this->routes(function () {

            ############# Маршруты для модулей ##################
            Route::domain('blog.' . config('app.url'))
                ->middleware('web')->name('blog.')
                ->namespace('Modules\Blog\Http\Controllers')
                ->group(module_path('Blog','/Routes/web.php'));

            Route::domain('admin.' . config('app.url'))
                ->middleware('web')->name('admin.')
                ->namespace('Modules\Admin\Http\Controllers')
                ->group(module_path('Admin','/Routes/web.php'));
            ######################################################

            Route::middleware('api')
                ->prefix('api')
                ->group(base_path('routes/api.php'));

            Route::middleware('web')
                ->namespace($this->namespace)
                ->group(base_path('routes/web.php'));
        });
    }
...
}

Обратите внимание:

  • маршруты поддоменов должны идти первыми, иначе, при совпадении URI, их перетрет основной домен
  • имена маршрутов должны быть уникальными. Если, например, в основном домене и в блоге существует маршрут 'home', то возникнет конфликт имен. Поэтому в маршруты модулей добавлены префиксы имен. Так маршрут 'home' в блоге будет иметь имя 'blog.home'

Далее необходимо закомментировать (или удалить) метод map() в RouteServiceProvider каждого модуля.

Теперь создадим CRUD контроллер в модуле Admin и пропишем к нему маршруты. Для создания контроллера вводим в консоли:


php artisan module:make-controller PostController Admin
После установки пакета nwidart/laravel-modules список консольных команд довольно сильно расширился. Например, кроме создания контроллеров, для каждого модуля можно создавать свои модели, миграции, политики и т.п. и конечно же команды управления самими модулями - просмотр, включение, отключение... Более подробно про команды можно прочитать на официальном сайте пакета.

Пропишем маршрут к ресурсам в файле Modules/Admin/Routes/web.php


Route::get('/post/deleted', 'PostController@deleted')->name('admin.post.deleted');
Route::get('/post/restore/one/{id}', 'PostController@restore')->name('admin.post.restore');
Route::get('/post/restore/all', 'PostController@restoreAll')->name('admin.post.restore_all');
Route::resource('/post', 'PostController')->names('admin.post');

Смотрим что получилось


php artisan route:list

GET|HEAD        blog.laravel.loc/ ........................................... blog. › Modules\Blog\Http\Controllers\BlogController@index
GET|HEAD        admin.laravel.loc/ ................................................. Modules\Admin\Http\Controllers\MainController@index
GET|HEAD        / .......................................................................................... home › HomeController@index
GET|HEAD        admin.laravel.loc/post .......................... admin.post.index › Modules\Admin\Http\Controllers\PostController@index
POST            admin.laravel.loc/post .......................... admin.post.store › Modules\Admin\Http\Controllers\PostController@store
GET|HEAD        admin.laravel.loc/post/create ................. admin.post.create › Modules\Admin\Http\Controllers\PostController@create
GET|HEAD        admin.laravel.loc/post/deleted .............. admin.post.deleted › Modules\Admin\Http\Controllers\PostController@deleted
GET|HEAD        admin.laravel.loc/post/restore/all ... admin.post.restore_all › Modules\Admin\Http\Controllers\PostController@restoreAll
GET|HEAD        admin.laravel.loc/post/restore/one/{id} ..... admin.post.restore › Modules\Admin\Http\Controllers\PostController@restore
GET|HEAD        admin.laravel.loc/post/{post} ..................... admin.post.show › Modules\Admin\Http\Controllers\PostController@show
PUT|PATCH       admin.laravel.loc/post/{post} ................. admin.post.update › Modules\Admin\Http\Controllers\PostController@update

Важлива інформація

Міністерство оборони
України
з 24.02 по 11.11
втрати противника
орієнтовно склали:
710660 ( +1770 ) особового складу
9253 ( +4 ) танків
18766 ( +40 ) бойових бронемашин
20314 ( +34 ) артилерійських систем
1245 ( +0 ) РСЗВ
996 ( +0 ) засоби ППО
369 ( +0 ) літаків
329 ( +0 ) гелікоптерів
28802 ( +119 ) автомобільної техніки
28 ( +0 ) кораблі / катери
2636 ( +2 ) крилаті ракети
18676 ( +57 ) БПЛА
3620 ( +16 ) спец. техніки
4 ( +0 ) установок ОТРК/ТРК
1 ( +0 ) підводні човни