Laravel 9. Модули и маршрутизация
Продолжаем работать с проектом. Создадим модули и настроим их как поддомены с помощью маршрутизации.
Поддомены и модули
Пусть наш проект будет иметь, кроме основного домена, еще два поддомена. Например на основном домене (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
Важлива інформація
України
втрати противника
орієнтовно склали: