Хлебные крошки
Чтобы добавить хлебные крошки в проект Laravel, будем использовать пакет diglactic/laravel-breadcrumbs. Я использовал его в довольно большом количестве проектов, начиная от небольших веб-сайтов и заканчивая довольно большими приложениями.
Установка и настройка
Начнем с установки пакета с помощью Composer используя следующею команду:
composer require diglactic/laravel-breadcrumbs
Когда мы установили пакет, можем опубликовать файл конфигурации в директории config/breadcrumbs.php
, используется для редактирования конфигурации пакета. В этой конкретной статье нас будет беспокоить только view
параметр в файле конфигурации. Для добавления конфига, выполните следующую команду:
php artisan vendor:publish --tag=breadcrumbs-config
Шаблон вывода
По умолчанию, вывод хлебных крошек на страницу, стилизуется с помощью Bootstrap 5, мы будем использовать свой код.
Создаем новый файл resources/views/partials/breadcrumbs.blade.php
, используя небольшой шаблон с которым можно начать работу:
resources/views/partials/breadcrumbs.blade.php<ul class="breadcrumb">
@foreach ($breadcrumbs as $breadcrumb)
@if (!is_null($breadcrumb->url) && !$loop->last)
<li><a href="{{ $breadcrumb->url }}">{{ $breadcrumb->title }}</a></li>
@else
<li class="active">{{ $breadcrumb->title }}</li>
@endif
@endforeach
</ul>
Чтобы использовать собственный шаблон, нужно обновить файл конфигурации. Нам просто нужно изменить view
поле, чтобы оно указывало на наш новый файл Blade, который мы только что создали:
config/breadcrumbs.phpreturn [
// ...
'view' => 'partials/breadcrumbs',
// ...
];
Пути хлебных крошек
Создайте файл с именем routes/breadcrumbs.php
, который выглядит следующим образом:
routes/breadcrumbs.php<?php
// Метод хлебных крошек
Breadcrumbs::for('имя_роута_хлебных_крошек', function ($trail) {
// Использование ранее вызванных крошек
$trail->parent('имя_роута_хлебных_крошек');
// Добавление новых хлебных крошек
$trail->push('отображаемое_название', route('имя_роута_из_файла_routes/web.php'));
});
Вот пример рабочего шаблона:
routes/breadcrumbs.php<?php
use Diglactic\Breadcrumbs\Breadcrumbs;
// Home
Breadcrumbs::for('home', function ($trail) {
$trail->push('Home', route('home'));
});
// Home > About
Breadcrumbs::for('about', function ($trail) {
$trail->parent('home');
$trail->push('About', route('about'));
});
// Home > Blog
Breadcrumbs::for('blog', function ($trail) {
$trail->parent('home');
$trail->push('Blog', route('blog'));
});
// Home > Blog > [Category]
Breadcrumbs::for('category', function ($trail, $category) {
$trail->parent('blog');
$trail->push($category->title, route('category', $category->id));
});
// Home > Blog > [Category] > [Post]
Breadcrumbs::for('post', function ($trail, $post) {
$trail->parent('category', $post->category);
$trail->push($post->title, route('post', $post->id));
});
Статические страницы
Самой простой хлебной крошкой, будет ваша домашняя страница которая будет выглядеть примерно так:
routes/breadcrumbs.phpuse Diglactic\Breadcrumbs\Breadcrumbs;
Breadcrumbs::for('home', function ($trail) {
$trail->push('Home', route('home'));
});
Просто вызываете $trail->push($title, $url)
внутри замыкания. Для создания URL-адреса можно использовать любой из стандартных методов генерации URL в Laravel:
url('path/to/route')
secure_url('path/to/route')
action('controller@action')( URL::action())
route('routename')
route('routename', 'param')
route('routename', ['param1', 'param2'])
Этот пример будет отображаться следующим образом:
{{ Breadcrumbs::render('home') }}
Результат:
Home
Родительские ссылки
Статическая страница, но перед ней есть родительская ссылка, вызывающие замыкание для home
хлебной крошки, определенной выше:
routes/breadcrumbs.phpuse Diglactic\Breadcrumbs\Breadcrumbs;
Breadcrumbs::for('blog', function ($trail) {
$trail->parent('home');
$trail->push('Blog', route('blog'));
});
{{ Breadcrumbs::render('blog') }}
Результат:
Home/Blog
Динамические ссылки
Динамически сгенерированная страница, извлеченная из базы данных:
routes/breadcrumbs.phpuse Diglactic\Breadcrumbs\Breadcrumbs;
Breadcrumbs::for('post', function ($trail, $post) {
$trail->parent('blog');
$trail->push($post->title, route('post'));
});
Объект $post
, это например модель Eloquent, но может быть чем угодно, в данном случае передан из представления, при необходимости можно передать несколько параметров:
{{ Breadcrumbs::render('post', $post) }}
Результат:
Home/Blog/То что пришло из базы
Вложенные категории
Если есть вложенные категории или другие особые требования, вы можете вызывать $trail->push()
несколько раз:
routes/breadcrumbs.phpBreadcrumbs::for('category', function ($trail, $category) {
$trail->parent('blog');
foreach ($category->ancestors as $ancestor) {
$trail->push($ancestor->title, route('category', $ancestor->id));
}
$trail->push($category->title, route('category', $category->id));
});
В качестве альтернативы вы можете создать рекурсивную функцию:
routes/breadcrumbs.phpBreadcrumbs::for('category', function ($trail, $category) {
if ($category->parent) {
$trail->parent('category', $category->parent);
} else {
$trail->parent('blog');
}
$trail->push($category->title, route('category', $category->slug));
});
Вызов:
{{ Breadcrumbs::render('category', $category) }}
Результат:
Home/Blog/Category/Category/Category
Исключение ошибок
Если хлебной крошки не существует, Laravel выдаст сообщение ошибки. Для отключения, если у вас есть некоторые страницы без хлебных крошек, сначала инициализируйте файл конфигурации, если вы еще этого не сделали:
php artisan vendor:publish --tag=breadcrumbs-config
Затем откройте config/breadcrumbs.php
и установите значения указанные ниже.
Используются хлебные крошки привязанные к маршруту, но соответствующий хлебной крошки не существует:
config/breadcrumbs.php'missing-route-bound-breadcrumb-exception' => false,
Используются хлебные крошки с привязкой к маршруту, но у текущего маршрута нет имени:
config/breadcrumbs.php'unnamed-route-exception' => false,
Используется хлебная крошка, но она не существует:
'invalid-named-breadcrumb-exception' => false
Вывод хлебных крошек
В нужном месте вызываем Breadcrumbs::render()
для каждой страницы, передав имя используемой навигационной цепочки из файла routes/breadcrumbs.php
и любые дополнительные параметры, включая запрос из базы или еще что-то, например:
{{ Breadcrumbs::render('home') }}
{{ Breadcrumbs::render('category', $category) }}