mediaholdings / laravel-breadcrumbs
以Laravel风格的简单方式创建导航路径。
Requires
- php: ^7.2 || ^8.0
- facade/ignition-contracts: ^1.0
- laravel/framework: ^6.0 || ^7.0 || ^8.0 || ^9.0 || ^10
Requires (Dev)
- orchestra/testbench: ^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0
- php-coveralls/php-coveralls: ^2.4
- phpunit/phpunit: ^8.5 || ^9.5
- spatie/phpunit-snapshot-assertions: ^2.2 || ^4.2
Conflicts
README
简介
以Laravel风格的简单方式创建导航路径。
此项目是官方分支,基于Dave James Miller的原创项目Laravel Breadcrumbs,并且没有众多出色的初始贡献者的支持是不可能实现的。谢谢大家!
目录
兼容性图表
对于较旧的Laravel版本,请参考原始GitHub项目。如果您更喜欢引用此包,所有标签都已镜像,但不会提供任何功能差异。
入门
1. 安装
composer require diglactic/laravel-breadcrumbs
2. 定义
创建一个名为 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)); });
有关更多详细信息,请参阅定义导航路径部分。
3. 样式
默认情况下,将渲染一个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
– Bulmabreadcrumbs::foundation6
– Foundation 6breadcrumbs::json-ld
– JSON-LD 结构化数据breadcrumbs::materialize
– Materializebreadcrumbs::tailwind
– Tailwind CSSbreadcrumbs::uikit
– UIkit- 或者,您可以指定自定义视图的路径,例如
partials.breadcrumbs
有关更多详细信息,请参阅自定义模板部分。
您还可以在运行时指定自定义视图。
4. 输出
在每个页面的视图中调用 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()
)- 或者直接传递一个字符串URL (
'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()
,传递要使用的面包屑名称和任何附加参数。
使用Blade
{{ 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页面,使用名称 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文档中的资源控制器。
(相关FAQ:为什么没有Breadcrumbs::resource()方法?。)
高级用法
无URL的面包屑
push()
的第二个参数是可选的,因此如果您想创建一个没有URL的面包屑,可以这样做
$trail->push('Sample');
在这种情况下,$breadcrumb->url
将是 null
。
默认的Bootstrap模板以CSS类 "active" 渲染此内容,与最后一个面包屑相同,因为否则它们默认为黑色文本而不是灰色,这看起来不太对。
自定义数据
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
,因为它们将被覆盖。
前后回调
您可以注册“before”和“after”回调,在路径的开始/结束处添加面包屑。例如,自动在末尾添加当前页码
<?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>
要忽略一个面包屑,请在push()
函数的$data
参数中添加'current' => false
。这可以用来忽略分页面包屑
<?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的集合类方法
<?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>
高级定制
对于更高级的定制,您可以子类化Breadcrumbs\Manager
和/或Breadcrumbs\Generator
,然后使用新类名更新配置文件
// 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
属性(用户可能没有)。根据您的需要进行调整。
故障排除
一般
- 重新阅读说明,并确保您已正确完成所有操作。
- 从简单的选项开始,只有在你理解了它是如何工作的之后,才使用高级选项(例如,路由绑定面包屑)。
未找到类 'Breadcrumbs'
- 尝试运行
composer update diglactic/laravel-breadcrumbs
进行升级。 - 尝试运行
php artisan package:discover
确保服务提供者被 Laravel 检测到。
未找到具有名称 ... 的面包屑
- 确保你在正确的位置注册面包屑(默认为
routes/breadcrumbs.php
)。- 尝试在文件中放置
dd(__FILE__)
以确保它已加载。 - 尝试在
ServiceProvider::registerBreadcrumbs()
中放置dd($files)
以检查路径是否正确。 - 如果不是这样,尝试运行
php artisan config:clear
(或手动删除bootstrap/cache/config.php
)或更新config/breadcrumbs.php
中的路径。
- 尝试在文件中放置
- 确保面包屑名称正确。
- 如果使用路由绑定面包屑,请确保它与路由名称完全匹配。
- 当使用路由绑定面包屑时(如果你不想在某些页面上显示面包屑),可以
- 使用空闭包(没有推送/父调用)进行注册,或者
- 在配置文件中将
missing-route-bound-breadcrumb-exception
设置为false
以禁用检查(但如果你遗漏了任何页面,则不会收到警告)。
ServiceProvider::registerBreadcrumbs():失败打开所需的 ...
- 确保路径正确。
- 如果是这样,请检查文件所有权 & 权限是否正确。
- 如果不是这样,尝试运行
php artisan config:clear
(或手动删除bootstrap/cache/config.php
)或更新config/breadcrumbs.php
中的路径。
未定义变量:breadcrumbs
- 确保你使用
{{ Breadcrumbs::render() }}
或{{ Breadcrumbs::view() }}
,而不是@include()
。
贡献
文档:如果你认为文档可以有任何改进,请 编辑此文件 并创建一个拉取请求。
错误修复:请修复它并创建一个 拉取请求。 (见下文 以获取更详细的说明。) 如果你添加了单元测试以确保它不会再次发生,那么你会得到加分!
新功能:只有具有明确用例和良好考虑的 API 的功能才会被接受。它们必须得到文档说明并包含单元测试。如果有疑问,请创建一个概念验证(可以是代码或文档),并创建一个 拉取请求 以讨论详细信息。(提示:如果你想要一个默认情况下不包含的过于特定的功能,请参阅 宏 或 高级用法 了解如何添加它们。)
创建一个拉取请求
在 Laravel 面包屑上工作的最简单方法是告诉 Composer 使用 --prefer-source
标志从源(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 git@github.com: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 中的边缘情况,这可能导致结果并不完全准确。[链接](https://phpunit.de/manual/current/en/code-coverage-analysis.html#code-coverage-analysis.edge-cases)。
Laravel 的新版本
以下文件需要更新,以便在新的 Laravel 版本上运行测试
-
laravel/framework
(Laravel 版本)php
(最低 PHP 版本)
-
jobs.phpunit.strategy.matrix.laravel
(Laravel 版本)jobs.phpunit.strategy.matrix.php
(PHP 版本)jobs.phpunit.strategy.matrix.exclude
(不支持组合)
如果需要更改,也请更新
许可证
Laravel Breadcrumbs 是一个开源软件,遵循 MIT 许可协议。