Простой способ создания хлебных крошек в стиле 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.