Laravel - вывод хлебных крошек
воскресенье, 13 января 2019 04:26:51, написал admin
Настройка хлебных крошек в Larevel с использованием davejamesmiller/laravel-breadcrumbs
Полная инструкция по установке https://github.com/davejamesmiller/laravel-breadcrumbs
Пример приведен для блога на Voyager.
Установка:
composer require davejamesmiller/laravel-breadcrumbs:5.x
Если в проекте используется не bootsrap4, а что-то другое, то тогда выполняем
php artisan vendor:publish --provider="DaveJamesMiller\Breadcrumbs\BreadcrumbsServiceProvider"
и в конфиге config/breadcrumbs.php
меняем строку
'view' => 'breadcrumbs::bootstrap4',
на одно из следующих значений:
- breadcrumbs::bootstrap4 – Bootstrap 4
- breadcrumbs::bootstrap3 – Bootstrap 3
- breadcrumbs::bootstrap2 – Bootstrap 2
- breadcrumbs::bulma – Bulma
- breadcrumbs::foundation6 – Foundation 6
- breadcrumbs::materialize – Materialize
- breadcrumbs::uikit – UIkit
- breadcrumbs::json-ld – JSON-LD Structured Data (<script> tag, no visible output)
Создаем файл routes/breadcrumbs.php с таким содержанием
<?php
// Home
Breadcrumbs::for('home', function ($breadcrumbs) {
// $breadcrumbs->parent('home');
$breadcrumbs->push('Главная', route('home'));
});
// Home > Welcome
Breadcrumbs::for('welcome', function ($breadcrumbs) {
$breadcrumbs->parent('home');
$breadcrumbs->push('Welcome', route('welcome'));
});
// Home > Contact
Breadcrumbs::for('contact', function ($breadcrumbs) {
$breadcrumbs->parent('home');
$breadcrumbs->push('Форма обратной связи', route('contacts'));
});
// Home > Blog
Breadcrumbs::for('blog', function ($breadcrumbs) {
$breadcrumbs->parent('home');
$breadcrumbs->push('Блог', route('blog.index'));
});
// Home > Blog > [Category] > [Post]
Breadcrumbs::for('post', function ($breadcrumbs, $post) {
$breadcrumbs->parent('category', $post->category);
$breadcrumbs->push($post->title, route('blog.show', $post->slug));
});
// Home > Blog > Archive
Breadcrumbs::for('archive', function ($breadcrumbs, $title, $year, $month) {
$breadcrumbs->parent('blog');
$breadcrumbs->push($title, route('blog.archive', ['year' => $year, 'month' => $month]));
});
// Home > Blog > Category
Breadcrumbs::for('category', function ($trail, $category) {
if ($category->parentId) {
$trail->parent('category', $category->parentId);
} else {
$trail->parent('blog');
}
$trail->push($category->name, route('blog.category', $category->slug));
});
// Home > Blog > Tag
Breadcrumbs::for('tag', function ($breadcrumbs, $tag) {
$breadcrumbs->parent('blog');
$breadcrumbs->push('Статьи с тэгом '.$tag->title, route('blog.tag', ['slug' => $tag->slug]));
});
// Home > [Page]
Breadcrumbs::for('page', function ($breadcrumbs, $page) {
$breadcrumbs->parent('home');
$breadcrumbs->push($page->title, route('page', $page->slug));
});
Обратите внимание на рекурсивный обход категорий в category и post
В лайоуте прописываем
@yield('breadcrumbs')
Во вью делаем вызов
@section('breadcrumbs', Breadcrumbs::render('post', $article))
Вот что получилось

С моделью категории Voyager у меня возникли проблемы. Там отношения описаны как
public function parentId()
{
return $this->belongsTo(self::class);
}
И во вью breadcrumbs не цепляется
$category->parentId
возвращает null. Потому что надо
public function parentId()
{
return $this->belongsTo(self::class, 'parent_id');
}
В итоге скопирвал класс TCG\Voyager\Models\Category в App\Category и поправил функцию. Конечный листинг:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
use TCG\Voyager\Facades\Voyager;
use TCG\Voyager\Traits\Translatable;
class Category extends Model
{
use Translatable;
protected $translatable = ['slug', 'name'];
protected $table = 'categories';
protected $fillable = ['slug', 'name'];
public function posts()
{
return $this->hasMany(Voyager::modelClass('Post'))
->published()
->orderBy('created_at', 'DESC');
}
public function parentId()
{
return $this->belongsTo(self::class, 'parent_id');
}
}
Breadcrumbs
Laravel
Laravel