Найти тему
Битрикс и не только

Laravel: работа с меню

Всем привет. Продолжаю практиковаться с 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() !!}

Если захотите использовать свой шаблон, то нужно проделать те же операции, что и с основным меню.

На этом все! Спасибо за внимание!