Всем привет. Продолжаю практиковаться с Laravel, в данной публикации расскажу про работу с меню.
Разумеется меню можно создать самостоятельно, но зачем изобретать велосипеды, если за нас уже все придумано. Приступим.
Первым шагом установим пакет для работы с меню lavary/laravel-menu
Выполним установку, при помощи composer
composer require lavary/laravel-menu
Добавим провайдер меню в config/app.php в массив 'providers'
Lavary\Menu\ServiceProvider::class,
а так же фасад меню в алиасы 'aliases'
'Menu' => Lavary\Menu\Facade::class,
Сразу сделаю небольшую оговорку: в большей части статей по использованию данного пакета описывается процесс передачи меню напрямую из используемого контроллера. Я расскажу, как сделать так, чтобы меню подключалось автоматически для все страниц(если в шаблоне описана секция для данного меню).
Данную информацию можно найти в официальной документации на гитхабе.
Создадим мидлвар GenerateMenus
php artisan make:middleware GenerateMenus
Не забываем добавить его в kernel.php
protected $middlewareGroups = [
'web' => [
// ......
\App\Http\Middleware\GenerateMenus::class,
],
// ..............
];
Переходим в файл App\Http\Middleware\GenerateMenus
и опишем меню в методе handle
public function handle($request, Closure $next)
{
\Menu::make('main_menu', function ($menu) {
$menu->add('Главная');
$menu->add('Новости', 'news');
$menu->add('О нас', [
'action' => [
'PageController@show', 'slug' => 'about'
]
]);
});
return $next($request);
}
Наше меню будет содержать три пункта: главная страница, новости, и страница О нас
Для работы с простыми страницами я использую PageController в который передается slug страницы, для выбора нужной страницы.
Перейдем к шаблонам:
в папке resources/includes создадим файлы main_menu.blade.php и main_menu_items.blade.php
Файл main_menu.blade.php
<ul class="navbar-nav mr-auto">
@include('includes.main_menu_items', ['items' => Menu::get('main_menu')->roots()])
</ul>
Файл main_menu_items.blade.php
@foreach($items as $item)
<li class="nav-item
@if($item->hasChildren()) dropdown @endif
@if($item->active) active @endif
">
<a class="nav-link" href="{!! $item->url() !!}">{!! $item->title !!} </a>
@if($item->hasChildren())
<ul class="dropdown-menu">
@include('includes.main_menu_items', ['items' => $item->children()])
</ul>
@endif
</li>
@endforeach
Файл layouts/app.blade.php
@include('includes.main_menu')
Вот и все, меню готово!
Если Вы захотите создать ещё одно меню, например, для футера или дополнительное меню, для конкретного раздела, достаточно так же описать его в ужу используемом мидлваре. Например, это будет right_menu:
\Menu::make('right_menu', function ($menu) {
$menu->add('Главная');
$menu->add('Новости', 'news');
$menu->add('О нас', [
'action' => [
'PageController@show', 'slug' => 'about'
]
]);
});
Содержимое оставим таким же и подключим данное меню в требуемом view, используя стандартный шаблон:
{!! Menu::get('right_menu')->asUl() !!}
Если захотите использовать свой шаблон, то нужно проделать те же операции, что и с основным меню.
На этом все! Спасибо за внимание!