Простой способ создания хлебных крошек в стиле Laravel.
Этот проект является официальным ответвлением фантастически оригинальной Laravel Breadcrumbs от Дэйва Джеймса Миллера и был бы невозможен без группы замечательных участников, внесших первый день. Спасибо всем!
Ларавел | Хлебные крошки Laravel |
---|---|
11.х | 9.х |
10.х | 9.х |
9.х | 9.х |
8.х | 9.х |
7.х | 8.х |
6.х | 8.х |
Для более старых версий Laravel обратитесь к исходному проекту GitHub. Все теги были зеркально отражены, если вы предпочитаете ссылаться на этот пакет, но функциональной разницы не будет.
composer require diglactic/laravel-breadcrumbs
Создайте файл с именем routes/breadcrumbs.php
, который выглядит следующим образом:
<?php // routes/breadcrumbs.php
// Note: Laravel will automatically resolve `Breadcrumbs::` without
// this import. This is nice for IDE syntax and refactoring.
use Diglactic Breadcrumbs Breadcrumbs ;
// This import is also not required, and you could replace `BreadcrumbTrail $trail`
// with `$trail`. This is nice for IDE type checking and completion.
use Diglactic Breadcrumbs Generator as BreadcrumbTrail ;
// Home
Breadcrumbs:: for ( ' home ' , function ( BreadcrumbTrail $ trail ) {
$ trail -> push ( ' Home ' , route ( ' home ' ));
});
// Home > Blog
Breadcrumbs:: for ( ' blog ' , function ( BreadcrumbTrail $ trail ) {
$ trail -> parent ( ' home ' );
$ trail -> push ( ' Blog ' , route ( ' blog ' ));
});
// Home > Blog > [Category]
Breadcrumbs:: for ( ' category ' , function ( BreadcrumbTrail $ trail , $ category ) {
$ trail -> parent ( ' blog ' );
$ trail -> push ( $ category -> title , route ( ' category ' , $ category ));
});
Дополнительные сведения см. в разделе «Определение хлебных крошек».
По умолчанию будет отображаться навигационный список Bootstrap 5. Чтобы изменить это, инициализируйте файл конфигурации, выполнив следующую команду:
php artisan vendor:publish --tag=breadcrumbs-config
Затем откройте config/breadcrumbs.php
и отредактируйте эту строку:
// config/breadcrumbs.php
' view ' => ' breadcrumbs::bootstrap5 ' ,
Возможные значения:
breadcrumbs::bootstrap5
– Bootstrap 5breadcrumbs::bootstrap4
– Bootstrap 4breadcrumbs::bulma
– Булмаbreadcrumbs::foundation6
– Foundation6breadcrumbs::json-ld
— структурированные данные JSON-LDbreadcrumbs::materialize
– Материализоватьbreadcrumbs::tailwind
– Tailwind CSSbreadcrumbs::uikit
– UIkitpartials.breadcrumbs
Более подробную информацию можно найти в разделе «Пользовательские шаблоны».
Вы также можете указать собственное представление во время выполнения.
Вызовите Breadcrumbs::render()
в представлении для каждой страницы, передав ему имя используемой навигационной цепочки и любые дополнительные параметры:
{{-- resources/views/home.blade.php --}}
{{ Breadcrumbs :: render ( ' home ' ) } }
{{-- resources/views/categories/show.blade.php --}}
{{ Breadcrumbs :: render ( ' category ' , $category ) } }
См. раздел «Вывод навигационных цепочек» для получения информации о других параметрах вывода и см. раздел «Навигационные цепочки с привязкой к маршруту», чтобы узнать, как автоматически связать имена навигационных цепочек с именами маршрутов.
Хлебные крошки обычно соответствуют действиям или типам страниц. Для каждой навигационной цепочки вы указываете имя, заголовок навигационной цепочки и URL-адрес для ссылки на нее. Поскольку они, скорее всего, будут меняться динамически, вы делаете это в замыкании и передаете в замыкание любые необходимые вам переменные.
Следующие примеры должны прояснить ситуацию:
Самой простой навигационной цепочкой, вероятно, будет ваша домашняя страница, которая будет выглядеть примерно так:
<?php // routes/breadcrumbs.php
use Diglactic Breadcrumbs Breadcrumbs ;
use Diglactic Breadcrumbs Generator as BreadcrumbTrail ;
Breadcrumbs:: for ( ' home ' , function ( BreadcrumbTrail $ trail ) {
$ trail -> push ( ' Home ' , route ( ' home ' ));
});
Для генерации URL-адреса вы можете использовать любой из стандартных методов генерации URL-адресов Laravel, в том числе:
url('path/to/route')
( URL::to()
)secure_url('path/to/route')
route('routename')
или route('routename', 'param')
или route('routename', ['param1', 'param2'])
( URL::route()
)action('controller@action')
( URL::action()
)'http://www.example.com/'
)Этот пример будет отображаться следующим образом:
{{ Breadcrumbs :: render ( ' home ' ) } }
И результат:
Дом
Это еще одна статическая страница, но перед ней находится родительская ссылка:
<?php // routes/breadcrumbs.php
use Diglactic Breadcrumbs Breadcrumbs ;
use Diglactic Breadcrumbs Generator as BreadcrumbTrail ;
Breadcrumbs:: for ( ' blog ' , function ( BreadcrumbTrail $ trail ) {
$ trail -> parent ( ' home ' );
$ trail -> push ( ' Blog ' , route ( ' blog ' ));
});
Он работает, вызывая замыкание для home
навигационной цепочки, определенной выше.
Это будет отображаться так:
{{ Breadcrumbs :: render ( ' blog ' ) } }
И результат:
Главная / Блог
Обратите внимание, что шаблоны по умолчанию не создают ссылку на последнюю навигационную цепочку (текущую страницу), даже если указан URL-адрес. Вы можете переопределить это, создав свой собственный шаблон — более подробную информацию см. в разделе «Пользовательские шаблоны».
Это динамически генерируемая страница, извлеченная из базы данных:
<?php // routes/breadcrumbs.php
use App Models Post ;
use Diglactic Breadcrumbs Breadcrumbs ;
use Diglactic Breadcrumbs Generator as BreadcrumbTrail ;
Breadcrumbs:: for ( ' post ' , function ( BreadcrumbTrail $ trail , Post $ post ) {
$ trail -> parent ( ' blog ' );
$ trail -> push ( $ post -> title , route ( ' post ' , $ post ));
});
Объект $post
(вероятно, модель Eloquent, но может быть чем угодно) будет передан из представления:
{{ Breadcrumbs :: render ( ' post ' , $post ) } }
В результате получается такой результат:
Главная / Блог / Название записи
Вы также можете связать вызовы методов с $trail
. Если вы используете PHP 7.4 и выше с поддержкой стрелочных функций, вы можете предпочесть следующий, более краткий синтаксис:
Breadcrumbs:: for (
' post ' ,
fn ( BreadcrumbTrail $ trail , Post $ post ) => $ trail
-> parent ( ' blog ' )
-> push ( $ post -> title , route ( ' post ' , $ post ))
);
Наконец, если у вас есть вложенные категории или другие особые требования, вы можете вызвать $trail->push()
несколько раз:
<?php // routes/breadcrumbs.php
use App Models Category ;
use Diglactic Breadcrumbs Breadcrumbs ;
use Diglactic Breadcrumbs Generator as BreadcrumbTrail ;
Breadcrumbs:: for ( ' category ' , function ( BreadcrumbTrail $ trail , Category $ category ) {
$ trail -> parent ( ' blog ' );
foreach ( $ category -> ancestors as $ ancestor ) {
$ trail -> push ( $ ancestor -> title , route ( ' category ' , $ ancestor ));
}
$ trail -> push ( $ category -> title , route ( ' category ' , $ category ));
});
В качестве альтернативы вы можете создать рекурсивную функцию, например:
<?php // routes/breadcrumbs.php
use App Models Category ;
use Diglactic Breadcrumbs Breadcrumbs ;
use Diglactic Breadcrumbs Generator as BreadcrumbTrail ;
Breadcrumbs:: for ( ' category ' , function ( BreadcrumbTrail $ trail , Category $ 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 ) } }
И в результате:
Главная / Блог / Категория «Бабушки и дедушки» / Категория «Родители» / Название категории
Чтобы настроить HTML, создайте собственный файл представления, подобный следующему:
{{-- resources/views/partials/breadcrumbs.blade.php --}}
@unless ( $breadcrumbs -> isEmpty () )
< ol class = " breadcrumb " >
@foreach ( $breadcrumbs as $breadcrumb )
@if ( ! is_null ( $breadcrumb -> url ) && ! $loop -> last )
< li class = " breadcrumb-item " >< a href = " {{ $breadcrumb -> url } } " > {{ $breadcrumb -> title } } </ a ></ li >
@else
< li class = " breadcrumb-item active " > {{ $breadcrumb -> title } } </ li >
@endif
@endforeach
</ ol >
@endunless
Если вы хотите работать с существующим встроенным шаблоном, выполните следующую команду:
php artisan vendor:publish --tag=breadcrumbs-views
При этом все встроенные шаблоны будут скопированы в каталог resources/views/vendor/breadcrumbs/
вашего проекта, что позволит вам вносить изменения напрямую.
Представление получит коллекцию под названием $breadcrumbs
.
Каждая хлебная крошка представляет собой объект со следующими ключами:
title
— заголовок навигационной цепочки.url
– URL-адрес навигационной цепочки или null
, если он не указан.$data
(см. Пользовательские данные).Затем обновите файл конфигурации, указав имя пользовательского представления:
// config/breadcrumbs.php
' view ' => ' partials.breadcrumbs ' , // --> resources/views/partials/breadcrumbs.blade.php
Альтернативно, вы можете пропустить пользовательское представление и вызвать Breadcrumbs::generate()
чтобы напрямую получить коллекцию хлебных крошек:
@foreach ( Breadcrumbs :: generate ( ' post ' , $post ) as $breadcrumb )
{{-- ... --}}
@endforeach
Вызовите Breadcrumbs::render()
в представлении для каждой страницы, передав ему имя используемой навигационной цепочки и любые дополнительные параметры.
{{ Breadcrumbs :: render ( ' home ' ) } }
Или с параметром:
{{ Breadcrumbs :: render ( ' category ' , $category ) } }
Чтобы отображать хлебные крошки в виде структурированных данных JSON-LD (обычно по причинам SEO), используйте Breadcrumbs::view()
для визуализации шаблона breadcrumbs::json-ld
в дополнение к обычному шаблону. Например:
< html >
< head >
...
{{ Breadcrumbs :: view ( ' breadcrumbs::json-ld ' , ' category ' , $category ) } }
...
</ head >
< body >
...
{{ Breadcrumbs :: render ( ' category ' , $category ) } }
...
</ body >
</ html >
(Примечание. Если вы используете Laravel Page Speed, вам может потребоваться отключить промежуточное программное обеспечение TrimUrls
.)
Чтобы указать изображение, добавьте его в параметр $data
в push()
:
<?php // routes/breadcrumbs.php
use App Models Post ;
use Diglactic Breadcrumbs Breadcrumbs ;
use Diglactic Breadcrumbs Generator as BreadcrumbTrail ;
Breadcrumbs:: for ( ' post ' , function ( BreadcrumbTrail $ trail , Post $ post ) {
$ trail -> parent ( ' home ' );
$ trail -> push ( $ post -> title , route ( ' post ' , $ post ), [ ' image ' => asset ( $ post -> image )]);
});
(Если вы предпочитаете использовать микроданные или RDFa, вам потребуется создать собственный шаблон.)
При обычном использовании вы должны вызвать Breadcrumbs::render($name, $params...)
для отображения хлебных крошек на каждой странице. Если хотите, вы можете назвать свои хлебные крошки так же, как и маршруты, и избежать дублирования.
Убедитесь, что у каждого вашего маршрута есть имя.
<?php // routes/web.php
use Illuminate Support Facades Route ;
// Home
Route:: name ( ' home ' )-> get ( ' / ' , ' HomeController@index ' );
// Home > [Post]
Route:: name ( ' post ' )-> get ( ' /post/{id} ' , ' PostController@show ' );
Более подробную информацию см. в разделе «Именованные маршруты» в документации Laravel.
Для каждого маршрута создайте навигационную цепочку с тем же именем и параметрами. Например:
<?php // routes/breadcrumbs.php
use App Models Post ;
use Diglactic Breadcrumbs Breadcrumbs ;
use Diglactic Breadcrumbs Generator as BreadcrumbTrail ;
// Home
Breadcrumbs:: for ( ' home ' , function ( BreadcrumbTrail $ trail ) {
$ trail -> push ( ' Home ' , route ( ' home ' ));
});
// Home > [Post]
Breadcrumbs:: for ( ' post ' , function ( BreadcrumbTrail $ trail , Post $ post ) {
$ trail -> parent ( ' home ' );
$ trail -> push ( $ post -> title , route ( ' post ' , $ post ));
});
Чтобы добавить хлебные крошки на пользовательскую страницу 404 Not Found, используйте имя errors.404
:
Breadcrumbs:: for ( ' errors.404 ' , function ( BreadcrumbTrail $ trail ) {
$ trail -> parent ( ' home ' );
$ trail -> push ( ' Page Not Found ' );
});
Вызовите Breadcrumbs::render()
без параметров в файле макета:
{{-- resources/views/app.blade.php --}}
{{ Breadcrumbs :: render () } }
Это автоматически выведет хлебные крошки, соответствующие текущему маршруту. То же самое относится к Breadcrumbs::generate()
и Breadcrumbs::view()
:
Мы создадим исключение InvalidBreadcrumbException
, если навигационная цепочка не существует, чтобы напомнить вам о необходимости ее создания. Чтобы отключить это (например, если у вас есть страницы без хлебных крошек), сначала инициализируйте файл конфигурации, если вы еще этого не сделали:
php artisan vendor:publish --tag=breadcrumbs-config
Затем откройте вновь созданный файл и установите это значение:
// config/breadcrumbs.php
' missing-route-bound-breadcrumb-exception ' => false,
Аналогичным образом, чтобы предотвратить выдачу UnnamedRouteException
, если у текущего маршрута нет имени, установите это значение:
// config/breadcrumbs.php
' unnamed-route-exception ' => false,
Laravel Breadcrumbs использует ту же привязку модели, что и контроллер. Например:
<?php // routes/web.php
use Illuminate Support Facades Route ;
Route:: name ( ' post ' )-> get ( ' /post/{post} ' , ' PostController@show ' );
<?php // app/Http/Controllers/PostController.php
use App Http Controllers Controller ;
use App Models Post ;
use Illuminate Contracts View View ;
class PostController extends Controller
{
public function show ( Post $ post ): View // <-- Route bound model is injected here
{
return view ( ' post/show ' , [ ' post ' => $ post ]);
}
}
<?php // routes/breadcrumbs.php
use App Models Post ;
use Diglactic Breadcrumbs Breadcrumbs ;
use Diglactic Breadcrumbs Generator as BreadcrumbTrail ;
Breadcrumbs:: for ( ' post ' , function ( BreadcrumbTrail $ trail , Post $ post ) { // <-- The same Post model is injected here
$ trail -> parent ( ' home ' );
$ trail -> push ( $ post -> title , route ( ' post ' , $ post ));
});
Это делает ваш код менее многословным и более эффективным, поскольку сообщение из базы данных загружается только один раз.
Более подробную информацию см. в разделе «Привязка модели маршрута» в документации Laravel.
Laravel автоматически создает имена маршрутов для изобретательных контроллеров, например photo.index
, которые вы можете использовать при определении своих хлебных крошек. Например:
<?php // routes/web.php
use App Http Controllers PhotoController ;
use Illuminate Support Facades Route ;
Route:: resource ( ' photo ' , PhotoController::class);
$ php artisan route:list
+--------+----------+--------------------+---------------+-------------------------+------------+
| Domain | Method | URI | Name | Action | Middleware |
+--------+----------+--------------------+---------------+-------------------------+------------+
| | GET|HEAD | photo | photo.index | PhotoController@index | |
| | GET|HEAD | photo/create | photo.create | PhotoController@create | |
| | POST | photo | photo.store | PhotoController@store | |
| | GET|HEAD | photo/{photo} | photo.show | PhotoController@show | |
| | GET|HEAD | photo/{photo}/edit | photo.edit | PhotoController@edit | |
| | PUT | photo/{photo} | photo.update | PhotoController@update | |
| | PATCH | photo/{photo} | | PhotoController@update | |
| | DELETE | photo/{photo} | photo.destroy | PhotoController@destroy | |
+--------+----------+--------------------+---------------+-------------------------+------------+
<?php // routes/breadcrumbs.php
use App Models Photo ;
use Diglactic Breadcrumbs Breadcrumbs ;
use Diglactic Breadcrumbs Generator as BreadcrumbTrail ;
// Photos
Breadcrumbs:: for ( ' photo.index ' , function ( BreadcrumbTrail $ trail ) {
$ trail -> parent ( ' home ' );
$ trail -> push ( ' Photos ' , route ( ' photo.index ' ));
});
// Photos > Upload Photo
Breadcrumbs:: for ( ' photo.create ' , function ( BreadcrumbTrail $ trail ) {
$ trail -> parent ( ' photo.index ' );
$ trail -> push ( ' Upload Photo ' , route ( ' photo.create ' ));
});
// Photos > [Photo Name]
Breadcrumbs:: for ( ' photo.show ' , function ( BreadcrumbTrail $ trail , Photo $ photo ) {
$ trail -> parent ( ' photo.index ' );
$ trail -> push ( $ photo -> title , route ( ' photo.show ' , $ photo ));
});
// Photos > [Photo Name] > Edit Photo
Breadcrumbs:: for ( ' photo.edit ' , function ( BreadcrumbTrail $ trail , Photo $ photo ) {
$ trail -> parent ( ' photo.show ' , $ photo );
$ trail -> push ( ' Edit Photo ' , route ( ' photo.edit ' , $ photo ));
});
Более подробную информацию см. в разделе «Контроллеры ресурсов» в документации Laravel.
(Связанные часто задаваемые вопросы: почему не существует метода Breadcrumbs::resource()?.)
Второй параметр push()
является необязательным, поэтому, если вам нужна навигационная цепочка без URL-адреса, вы можете сделать:
$ trail -> push ( ' Sample ' );
В этом случае $breadcrumb->url
будет иметь null
.
Предоставленные шаблоны Bootstrap по умолчанию отображают это с помощью CSS-класса «активный», такого же, как и последняя навигационная цепочка, потому что в противном случае они по умолчанию используют черный текст, а не серый, что выглядит неправильно.
Метод push()
принимает необязательный третий параметр $data
— массив произвольных ассоциативных массивов данных, которые будут переданы в хлебную крошку, которую вы можете использовать в своем собственном шаблоне.
Например, если вы хотите, чтобы каждая хлебная крошка имела значок, вы можете сделать:
$ trail -> push ( ' Home ' , ' / ' , [ ' icon ' => ' home.png ' ]);
Записи массива $data
будут объединены в навигационную цепочку как свойства.
< li >
< a href = " {{ $breadcrumb -> url } } " >
< img src = " /images/icons/ {{ $breadcrumb -> icon } } " >
{{ $breadcrumb -> title } }
</ a >
</ li >
Примечание. Не используйте ключи title
или url
, так как они будут перезаписаны.
Вы можете зарегистрировать обратные вызовы «до» и «после», чтобы добавлять хлебные крошки в начале/конце следа. Например, чтобы автоматически добавить номер текущей страницы в конце:
<?php // routes/breadcrumbs.php
use Diglactic Breadcrumbs Breadcrumbs ;
use Diglactic Breadcrumbs Generator as BreadcrumbTrail ;
Breadcrumbs:: after ( function ( BreadcrumbTrail $ trail ) {
$ page = ( int ) request ( ' page ' , 1 );
if ( $ page > 1 ) {
$ trail -> push ( " Page { $ page }" );
}
});
Чтобы получить последнюю навигационную цепочку для текущей страницы, используйте Breadcrumb::current()
. Например, вы можете использовать это для вывода заголовка текущей страницы:
< title > {{ ( $breadcrumb = Breadcrumbs :: current ()) ? $breadcrumb -> title : ' Fallback Title ' } } </ title >
Чтобы игнорировать навигационную цепочку, добавьте 'current' => false
к параметру $data
в push()
. Это может быть полезно для игнорирования хлебных крошек нумерации страниц:
<?php // routes/breadcrumbs.php
use Diglactic Breadcrumbs Breadcrumbs ;
use Diglactic Breadcrumbs Generator as BreadcrumbTrail ;
Breadcrumbs:: after ( function ( BreadcrumbTrail $ trail ) {
$ page = ( int ) request ( ' page ' , 1 );
if ( $ page > 1 ) {
$ trail -> push ( " Page { $ page }" , null , [ ' current ' => false ]);
}
});
< title >
{{ ( $breadcrumb = Breadcrumbs :: current ()) ? " $breadcrumb -> title – " : ' ' } }
{{ ( $page = ( int ) request ( ' page ' )) > 1 ? " Page $page – " : ' ' } }
Demo App
</ title >
Для более продвинутой фильтрации вместо этого используйте методы класса Breadcrumbs::generate()
и Laravel Collection:
<?php
use Diglactic Breadcrumbs Breadcrumbs ;
$ current = Breadcrumbs:: generate ()-> where ( ' current ' , ' !== ' , false )-> last ();
Вы можете использовать Breadcrumbs::view()
вместо Breadcrumbs::render()
для рендеринга шаблона, отличного от шаблона по умолчанию:
{{ Breadcrumbs :: view ( ' partials.breadcrumbs2 ' , ' category ' , $category ) } }
Или вы можете переопределить настройку конфигурации, чтобы повлиять на все будущие вызовы render()
:
<?php
use Illuminate Support Facades Config ;
Config:: set ( ' breadcrumbs.view ' , ' partials.breadcrumbs2 ' );
{{ Breadcrumbs :: render ( ' category ' , $category ) } }
Или вы можете вызвать Breadcrumbs::generate()
, чтобы получить коллекцию хлебных крошек и загрузить представление вручную:
@include ( ' partials.breadcrumbs2 ' , [ ' breadcrumbs ' => Breadcrumbs :: generate ( ' category ' , $category )] )
Если вы вызываете Breadcrumbs::render()
или Breadcrumbs::generate()
без параметров, по умолчанию будут использоваться имя и параметры текущего маршрута (которые возвращаются методом Laravel Route::current()
).
Вы можете переопределить это, вызвав Breadcrumbs::setCurrentRoute($name, $param1, $param2...)
.
Чтобы проверить, существует ли навигационная цепочка с заданным именем, вызовите Breadcrumbs::exists('name')
, который возвращает логическое значение.
Если вы не хотите использовать routes/breadcrumbs.php
, вы можете изменить его в файле конфигурации. Сначала инициализируйте файл конфигурации, если вы еще этого не сделали:
php artisan vendor:publish --tag=breadcrumbs-config
Обновите эту строку:
// config/breadcrumbs.php
' files ' => base_path ( ' routes/breadcrumbs.php ' ),
Это может быть абсолютный путь, как указано выше, или массив:
' files ' => [
base_path ( ' breadcrumbs/admin.php ' ),
base_path ( ' breadcrumbs/frontend.php ' ),
],
Таким образом, вы можете использовать glob()
для автоматического поиска файлов с использованием подстановочного знака:
' files ' => glob ( base_path ( ' breadcrumbs/*.php ' )),
Или верните пустой массив []
чтобы отключить загрузку.
Если вы создаете свой собственный пакет, просто загрузите файл хлебных крошек из метода boot()
вашего поставщика услуг:
use Illuminate Support ServiceProvider ;
class MyServiceProvider extends ServiceProvider
{
public function boot (): void
{
if ( class_exists ( ' Breadcrumbs ' )) {
require __DIR__ . ' /breadcrumbs.php ' ;
}
}
}
Если хотите, вы можете использовать внедрение зависимостей для доступа к экземпляру Manager
вместо использования фасада Breadcrumbs::
<?php
use Diglactic Breadcrumbs Manager ;
use Illuminate Support ServiceProvider ;
class MyServiceProvider extends ServiceProvider
{
public function boot ( Manager $ breadcrumbs ): void
{
$ breadcrumbs -> for (...);
}
}
Класс Manager
хлебных крошек» поддерживает макросы, поэтому вы можете добавлять свои собственные методы. Например:
<?php
use Diglactic Breadcrumbs Breadcrumbs ;
Breadcrumbs:: macro ( ' pageTitle ' , function () {
$ title = ( $ breadcrumb = Breadcrumbs:: current ()) ? "{ $ breadcrumb -> title } – " : '' ;
if (( $ page = ( int ) request ( ' page ' )) > 1 ) {
$ title .= " Page $ page – " ;
}
return "{ $ title } - Demo App " ;
});
< title > {{ Breadcrumbs :: pageTitle () } } </ title >
Для более сложных настроек вы можете создать подкласс BreadcrumbsManager
и/или BreadcrumbsGenerator
, а затем обновить файл конфигурации, указав новое имя класса:
// breadcrumbs/config.php
' manager-class ' => Diglactic Breadcrumbs Manager::class,
' generator-class ' => Diglactic Breadcrumbs Generator::class,
Примечание. Синтаксис конфигурации может меняться в разных выпусках.
Breadcrumbs::resource()
? Несколько человек предложили добавить Breadcrumbs::resource()
для соответствия Route::resource()
, но никто не придумал хорошей реализации, которая а) была бы достаточно гибкой для работы с переводами, вложенными ресурсами и т. д., и б ) в результате не является слишком сложным.
Вы всегда можете создать свой собственный, используя Breadcrumbs::macro()
. Вот хорошая отправная точка:
<?php // routes/breadcrumbs.php
use App Models SomeModel ;
use Diglactic Breadcrumbs Breadcrumbs ;
use Diglactic Breadcrumbs Generator as BreadcrumbTrail ;
Breadcrumbs:: macro ( ' resource ' , function ( string $ name , string $ title ) {
// Home > Blog
Breadcrumbs:: for ( "{ $ name } .index " , function ( BreadcrumbTrail $ trail ) use ( $ name , $ title ) {
$ trail -> parent ( ' home ' );
$ trail -> push ( $ title , route ( "{ $ name } .index " ));
});
// Home > Blog > New
Breadcrumbs:: for ( "{ $ name } .create " , function ( BreadcrumbTrail $ trail ) use ( $ name ) {
$ trail -> parent ( "{ $ name } .index " );
$ trail -> push ( ' New ' , route ( "{ $ name } .create " ));
});
// Home > Blog > Post 123
Breadcrumbs:: for ( "{ $ name } .show " , function ( BreadcrumbTrail $ trail , SomeModel $ model ) use ( $ name ) {
$ trail -> parent ( "{ $ name } .index " );
$ trail -> push ( $ model -> title , route ( "{ $ name } .show " , $ model ));
});
// Home > Blog > Post 123 > Edit
Breadcrumbs:: for ( "{ $ name } .edit " , function ( BreadcrumbTrail $ trail , SomeModel $ model ) use ( $ name ) {
$ trail -> parent ( "{ $ name } .show " , $ model );
$ trail -> push ( ' Edit ' , route ( "{ $ name } .edit " , $ model ));
});
});
Breadcrumbs:: resource ( ' blog ' , ' Blog ' );
Breadcrumbs:: resource ( ' photos ' , ' Photos ' );
Breadcrumbs:: resource ( ' users ' , ' Users ' );
Обратите внимание, что это не касается переводов или вложенных ресурсов и предполагает, что все модели имеют атрибут title
(чего у пользователей, вероятно, нет). Адаптируйте его так, как считаете нужным.
composer update diglactic/laravel-breadcrumbs
для обновления.php artisan package:discover
, чтобы убедиться, что поставщик услуг обнаружен Laravel. routes/breadcrumbs.php
).dd(__FILE__)
в файл, чтобы убедиться, что он загружен.dd($files)
в ServiceProvider::registerBreadcrumbs()
чтобы проверить правильность пути.php artisan config:clear
(или вручную удалите bootstrap/cache/config.php
) или обновите путь в config/breadcrumbs.php
.missing-route-bound-breadcrumb-exception
значение false
в файле конфигурации, чтобы отключить проверку (но вы не будете предупреждены, если пропустите какие-либо страницы). php artisan config:clear
(или вручную удалите bootstrap/cache/config.php
) или обновите путь в config/breadcrumbs.php
. {{ Breadcrumbs::render() }}
или {{ Breadcrumbs::view() }}
, а не @include()
. Документация: Если вы считаете, что документацию можно каким-либо образом улучшить, отредактируйте этот файл и отправьте запрос на включение.
Исправления ошибок: исправьте ошибку и откройте запрос на включение. (Более подробные инструкции см. ниже.) Бонусные баллы, если вы добавите модульный тест, чтобы такого больше не повторилось!
Новые функции: будут приняты только функции с четким сценарием использования и продуманным API. Они должны быть задокументированы и включать модульные тесты. Если у вас есть сомнения, подготовьте подтверждение концепции (код или документацию) и откройте запрос на включение, чтобы обсудить детали. (Совет. Если вы хотите, чтобы по умолчанию была включена слишком специфичная функция, см. способы ее добавления в разделе «Макросы или расширенное использование».)
Самый простой способ работать с Laravel Breadcrumbs — указать Composer установить его из исходного кода (Git), используя флаг --prefer-source
:
rm -rf vendor/diglactic/laravel-breadcrumbs
composer install --prefer-source
Затем проверьте основную ветку и создайте собственную локальную ветку для работы:
cd vendor/diglactic/laravel-breadcrumbs
git checkout -t origin/main
git checkout -b YOUR_BRANCH
Теперь внесите изменения, включая модульные тесты и документацию (если необходимо). Запустите модульные тесты, чтобы убедиться, что все по-прежнему работает:
vendor/bin/phpunit
Затем зафиксируйте изменения. Создайте форк репозитория на GitHub, если вы еще этого не сделали, и внесите в него свои изменения:
git remote add YOUR_USERNAME [email protected]:YOUR_USERNAME/laravel-breadcrumbs.git
git push -u YOUR_USERNAME YOUR_BRANCH
Наконец, перейдите в репозиторий на GitHub и создайте запрос на включение.
Чтобы использовать в проекте собственную вилку, обновите composer.json
в основном проекте следующим образом:
{
// ADD THIS:
"repositories" : [
{
"type" : "vcs" ,
"url" : "https://github.com/YOUR_USERNAME/laravel-breadcrumbs.git"
}
] ,
"require" : {
// UPDATE THIS:
"diglactic/laravel-breadcrumbs" : "dev-YOUR_BRANCH"
}
}
Замените YOUR_USERNAME
своим именем пользователя GitHub, а YOUR_BRANCH
— названием ветки (например, develop
). Это говорит Composer использовать ваш репозиторий вместо репозитория по умолчанию.
Чтобы запустить модульные тесты:
vendor/bin/phpunit
Чтобы запустить модульные тесты и перестроить снимки:
vendor/bin/phpunit -d --update-snapshots
Чтобы проверить покрытие кода:
vendor/bin/phpunit --coverage-html test-coverage
Затем откройте test-coverage/index.html
чтобы просмотреть результаты. Помните о крайних случаях в PHPUnit, которые могут сделать его не совсем точным.
Следующие файлы необходимо обновить для запуска тестов на новой версии Laravel:
composer.json
laravel/framework
(версии Laravel)php
(минимальная версия PHP) tests.yml
jobs.phpunit.strategy.matrix.laravel
(версии Laravel)jobs.phpunit.strategy.matrix.php
(версии PHP)jobs.phpunit.strategy.matrix.exclude
(неподдерживаемые комбинации)И следующую документацию, при необходимости:
README.md
UPGRADE.md
Laravel Breadcrumbs — это программное обеспечение с открытым исходным кодом, лицензированное по лицензии MIT.