一种简单的 Laravel 风格的创建面包屑的方法。
这个项目是 Dave James Miller 原创的 Laravel Breadcrumbs 的官方分支,如果没有一群出色的第一天贡献者,这个项目是不可能实现的。谢谢大家!
拉维尔 | Laravel 面包屑 |
---|---|
11.x | 9.x |
10.x | 9.x |
9.x | 9.x |
8.x | 9.x |
7.x | 8.x |
6.x | 8.x |
对于较旧的 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
– 基础 6breadcrumbs::json-ld
– JSON-LD 结构化数据breadcrumbs::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,您可以使用任何标准的 Laravel URL 生成方法,包括:
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
中间件。)
要指定图像,请将其添加到push()
中的$data
参数:
<?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 )]);
});
(如果您更喜欢使用 Microdata 或 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 模板使用“active”的 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
添加到push()
中的$data
参数。这对于忽略分页面包屑很有用:
<?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()
来获取 breadcrumbs Collection 并手动加载视图:
@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::
Facade:
<?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()
,但没有人想出一个好的实现:a) 足够灵活来处理翻译、嵌套资源等,b) )因此并不太复杂。
您始终可以使用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 最简单的方法是使用--prefer-source
标志告诉 Composer 从源代码 (Git) 安装它:
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 上的存储库并创建拉取请求。
要在项目中使用您自己的 fork,请更新主项目中的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 许可证授权的开源软件。