bluesalt-labs / laravel-breadcrumbs
创建面包屑的简单Laravel风格方法。由davejamesmiller/laravel-breadcrumbs分支而来
Requires
- php: >=7.1.3
- facade/ignition-contracts: ^1.0
- laravel/framework: >=5.6
Requires (Dev)
- orchestra/testbench: >=3.6
- php-coveralls/php-coveralls: ^2.0
- phpunit/phpunit: ^7.0|^8.0
- spatie/phpunit-snapshot-assertions: ^2.0
README
由于我正在积极使用此存储库,因此我创建了分支以修复可能出现的任何破坏性更改。这不是真正的维护,但将允许活跃的项目继续使用此包。我将尽我所能(和时间)将使用此包的项目保持与PHP和Laravel的最新版本同步,因此如果其他人有兴趣使用它,它应该会继续工作。
原始文档
截至2020年4月18日,Laravel Breadcrumbs不再维护。
它可能还会继续工作一段时间 - 我已从composer.json中删除了版本约束,因此它将一直工作,直到Laravel的某个未来版本进行破坏性更改。
如果您想创建自己的分支,以修复错误或添加新功能,请参阅下面的说明。MIT许可证要求您保留版权声明和许可证信息,但除此之外,您可以随意使用代码和文档。
感谢过去7年中帮助维护并添加功能的贡献者 - 我只是没有2013年那样维护开源项目(或撰写博客文章,或社交媒体)的能量,我已决定是时候专注于新项目了。
— 戴夫

Laravel Breadcrumbs
创建面包屑的简单Laravel方法。
目录
兼容性图表
入门指南
注意:如果您使用的是旧版本,请在上面的表中单击它以查看该版本的文档。
注意2:如果您认为可以以任何方式改进此文档,请编辑此文件并提交拉取请求。
1. 安装Laravel Breadcrumbs
在命令行中运行此命令
composer require davejamesmiller/laravel-breadcrumbs:5.x
这将更新composer.json并将包安装到vendor/目录中。
2. 定义您的面包屑
创建一个名为routes/breadcrumbs.php的文件,如下所示
<?php // Home Breadcrumbs::for('home', function ($trail) { $trail->push('Home', route('home')); }); // Home > About Breadcrumbs::for('about', function ($trail) { $trail->parent('home'); $trail->push('About', route('about')); }); // Home > Blog Breadcrumbs::for('blog', function ($trail) { $trail->parent('home'); $trail->push('Blog', route('blog')); }); // Home > Blog > [Category] Breadcrumbs::for('category', function ($trail, $category) { $trail->parent('blog'); $trail->push($category->title, route('category', $category->id)); }); // Home > Blog > [Category] > [Post] Breadcrumbs::for('post', function ($trail, $post) { $trail->parent('category', $post->category); $trail->push($post->title, route('post', $post->id)); });
有关更多详细信息,请参阅定义面包屑部分。
3. 选择一个模板
默认情况下,将渲染一个兼容Bootstrap的有序列表,因此如果您正在使用Bootstrap 4,则可以跳过此步骤。
首先通过运行此命令初始化配置文件
php artisan vendor:publish --tag=breadcrumbs-config
然后打开config/breadcrumbs.php并编辑此行
'view' => 'breadcrumbs::bootstrap4',
可能的值是
breadcrumbs::bootstrap4– Bootstrap 4breadcrumbs::bootstrap3– Bootstrap 3breadcrumbs::bootstrap2– Bootstrap 2breadcrumbs::bulma– Bulmabreadcrumbs::foundation6– Foundation 6breadcrumbs::materialize– Materializebreadcrumbs::uikit– UIkitbreadcrumbs::json-ld– JSON-LD 结构化数据 (<script> 标签,无可见输出)- 自定义视图的路径:例如
partials.breadcrumbs
有关详细信息,请参阅 自定义模板 部分。
4. 输出面包屑
最后,在每个页面的视图中调用 Breadcrumbs::render(),传入要使用的面包屑名称和任何附加参数 - 例如
{{ Breadcrumbs::render('home') }} {{ Breadcrumbs::render('category', $category) }}
请参阅 输出面包屑 部分以获取其他输出选项,并查看 路由绑定面包屑 以自动将面包屑名称链接到路由名称。
定义面包屑
面包屑通常对应于操作或页面类型。对于每个指定的面包屑,您需要指定一个名称、面包屑标题以及链接到的 URL。由于这些内容可能会动态更改,您可以在闭包中这样做,并将任何需要的变量传递到闭包中。
以下示例应能使其清晰明了
静态页面
最简单的面包屑可能就是您的首页,看起来可能像这样
Breadcrumbs::for('home', function ($trail) { $trail->push('Home', route('home')); });
如您所见,您只需在闭包内部调用 $trail->push($title, $url) 即可。
生成 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') }}
并产生以下输出
首页
父级链接
这是一个带有父级链接的另一个静态页面
Breadcrumbs::for('blog', function ($trail) { $trail->parent('home'); $trail->push('Blog', route('blog')); });
它是通过调用上面定义的 home 面包屑的闭包来实现的。
它的呈现方式如下
{{ Breadcrumbs::render('blog') }}
并产生以下输出
首页 / 博客
请注意,默认模板不会为最后一个面包屑(当前页面)创建链接,即使指定了 URL。您可以通过创建自己的模板来覆盖此功能 - 更多详细信息请参阅 自定义模板。
动态标题和链接
这是一个从数据库中拉取的动态生成页面
Breadcrumbs::for('post', function ($trail, $post) { $trail->parent('blog'); $trail->push($post->title, route('post', $post)); });
从视图中传入的 $post 对象(可能是一个 Eloquent 模型,但可能什么都是)
{{ Breadcrumbs::render('post', $post) }}
它产生以下输出
提示:如有必要,您可以传递多个参数。
嵌套分类
最后,如果您有嵌套分类或其他特殊要求,您可以多次调用 $trail->push()
Breadcrumbs::for('category', function ($trail, $category) { $trail->parent('blog'); foreach ($category->ancestors as $ancestor) { $trail->push($ancestor->title, route('category', $ancestor->id)); } $trail->push($category->title, route('category', $category->id)); });
或者您可以创建一个递归函数,如下所示
Breadcrumbs::for('category', function ($trail, $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),如下所示
@if (count($breadcrumbs)) <ol class="breadcrumb"> @foreach ($breadcrumbs as $breadcrumb) @if ($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> @endif
(查看内置模板的 views/ 目录。)
视图数据
视图将接收一个名为 $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
在页面中(例如 resources/views/home.blade.php)
{{ Breadcrumbs::render('home') }}
或使用参数
{{ Breadcrumbs::render('category', $category) }}
使用Blade布局和@section
在页面中(例如 resources/views/home.blade.php)
@extends('layout.name') @section('breadcrumbs') {{ Breadcrumbs::render('home') }} @endsection
或使用简写语法
@extends('layout.name') @section('breadcrumbs', Breadcrumbs::render('home'))
并在布局中(例如 resources/views/layout/name.blade.php)
@yield('breadcrumbs')
纯PHP(无Blade)
在页面中(例如 resources/views/home.php)
<?= Breadcrumbs::render('home') ?>
或者如果你更喜欢使用长语法
<?php echo Breadcrumbs::render('home') ?>
结构化数据
要作为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 参数
Breadcrumbs::for('post', function ($trail, $post) { $trail->parent('home'); $trail->push($post->title, route('post', $post), ['image' => asset($post->image)]); });
(如果你更喜欢使用Microdata或RDFa,你需要创建一个 自定义模板。)
路由绑定面包屑
在正常使用中,你必须调用 Breadcrumbs::render($name, $params...) 在每个页面上渲染面包屑。如果你愿意,你可以将面包屑命名为与你的路由相同的名称,从而避免这种重复...
命名你的路由
确保你的每个路由都有一个名称。例如 (routes/web.php)
// Home Route::name('home')->get('/', 'HomeController@index'); // Home > [Post] Route::name('post')->get('/post/{id}', 'PostController@show');
更多详情请见Laravel文档中的 命名路由。
命名你的面包屑以匹配
对于每个路由,创建一个与同一名称和参数相同的面包屑。例如 (routes/breadcrumbs.php)
// Home Breadcrumbs::for('home', function ($trail) { $trail->push('Home', route('home')); }); // Home > [Post] Breadcrumbs::for('post', function ($trail, $id) { $post = Post::findOrFail($id); $trail->parent('home'); $trail->push($post->title, route('post', $post)); });
要向自定义404 Not Found页面添加面包屑,使用名称 errors.404
// Error 404 Breadcrumbs::for('errors.404', function ($trail) { $trail->parent('home'); $trail->push('Page Not Found'); });
在布局中输出面包屑
在布局文件中调用 Breadcrumbs::render()(例如 resources/views/app.blade.php)无参数
{{ Breadcrumbs::render() }}
这会自动输出与当前路由对应的面包屑。同样适用于 Breadcrumbs::generate()
$breadcrumbs = Breadcrumbs::generate();
以及 Breadcrumbs::view()
{{ Breadcrumbs::view('breadcrumbs::json-ld') }}
路由绑定异常
如果面包屑不存在,将抛出InvalidBreadcrumbException异常,以提醒您创建一个。要禁用此功能(例如,如果您有一些没有面包屑的页面),首先初始化配置文件(如果您还没有的话)。
php artisan vendor:publish --tag=breadcrumbs-config
然后打开config/breadcrumbs.php并设置此值。
'missing-route-bound-breadcrumb-exception' => false,
类似地,要防止抛出UnnamedRouteException异常(如果当前路由没有名称),请设置此值。
'unnamed-route-exception' => false,
路由模型绑定
Laravel面包屑使用与控制器相同的模型绑定。例如:
// routes/web.php Route::name('post')->get('/post/{post}', 'PostController@show');
// app/Http/Controllers/PostController.php use App\Post; class PostController extends Controller { public function show(Post $post) // <-- Implicit model binding happens here { return view('post/show', ['post' => $post]); } }
// routes/breadcrumbs.php Breadcrumbs::for('post', function ($trail, $post) { // <-- The same Post model is injected here $trail->parent('home'); $trail->push($post->title, route('post', $post)); });
这使您的代码更简洁、更高效,只需从数据库中加载一次帖子。
有关更多详细信息,请参阅Laravel文档中的路由模型绑定。
资源控制器
Laravel自动为资源控制器创建路由名称,例如photo.index,您可以在定义面包屑时使用它。例如:
// routes/web.php 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 | |
+--------+----------+--------------------+---------------+-------------------------+------------+
// routes/breadcrumbs.php // Photos Breadcrumbs::for('photo.index', function ($trail) { $trail->parent('home'); $trail->push('Photos', route('photo.index')); }); // Photos > Upload Photo Breadcrumbs::for('photo.create', function ($trail) { $trail->parent('photo.index'); $trail->push('Upload Photo', route('photo.create')); }); // Photos > [Photo Name] Breadcrumbs::for('photo.show', function ($trail, $photo) { $trail->parent('photo.index'); $trail->push($photo->title, route('photo.show', $photo->id)); }); // Photos > [Photo Name] > Edit Photo Breadcrumbs::for('photo.edit', function ($trail, $photo) { $trail->parent('photo.show', $photo); $trail->push('Edit Photo', route('photo.edit', $photo->id)); });
有关更多详细信息,请参阅Laravel文档中的资源控制器。
(相关常见问题解答:为什么没有Breadcrumbs::resource()方法?。)
高级用法
无URL的面包屑
push()的第二个参数是可选的,因此如果您想要一个没有URL的面包屑,可以这样做。
$trail->push('Sample');
$breadcrumb->url的值将是null。
默认的Bootstrap模板会将其渲染为具有"active"CSS类的样式,这与最后一个面包屑相同,因为否则它们默认为黑色文本而不是灰色,这看起来不合适。
自定义数据
push()方法接受一个可选的第三个参数,即$data——一个要传递给面包屑的任意数据数组,您可以在自定义模板中使用它。例如,如果您想要每个面包屑都有一个图标,您可以这样做:
$trail->push('Home', '/', ['icon' => 'home.png']);
$data数组条目将被合并到面包屑中作为属性,因此您可以在模板中像这样访问图标:$breadcrumb->icon,如下所示:
<li><a href="{{ $breadcrumb->url }}"> <img src="/images/icons/{{ $breadcrumb->icon }}"> {{ $breadcrumb->title }} </a></li>
不要使用title或url键,因为它们将被覆盖。
前后回调
您可以注册"before"和"after"回调,在路径的开始/结束处添加面包屑。例如,要自动在末尾添加当前页码:
Breadcrumbs::after(function ($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。这可以用来忽略分页面包屑:
Breadcrumbs::after(function ($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的集合类方法。
$current = Breadcrumbs::generate()->where('current', '!==', 'false)->last();
在运行时切换视图
您可以使用Breadcrumbs::view()代替Breadcrumbs::render()来渲染除了默认模板之外的模板。
{{ Breadcrumbs::view('partials.breadcrumbs2', 'category', $category) }}
或者,您可以覆盖配置设置以影响所有未来的render()调用。
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 register() {} public function boot() { if (class_exists('Breadcrumbs')) { require __DIR__ . '/breadcrumbs.php'; } } }
依赖注入
您可以使用 依赖注入 来访问 BreadcrumbsManager 实例,如果您更喜欢,而不是使用 Breadcrumbs:: 门面
use BlueSaltLabs\Breadcrumbs\BreadcrumbsManager; use Illuminate\Support\ServiceProvider; class MyServiceProvider extends ServiceProvider { public function register() {} public function boot(BreadcrumbsManager $breadcrumbs) { $breadcrumbs->register(...); } }
宏
BreadcrumbsManager 类是 可宏化的,因此您可以添加自己的方法。例如
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,然后使用新的类名更新配置文件
// Manager 'manager-class' => BlueSaltLabs\Breadcrumbs\BreadcrumbsManager::class, // Generator 'generator-class' => BlueSaltLabs\Breadcrumbs\BreadcrumbsGenerator::class,
(注意: 任何不属于公共 API(见下文)的内容都可能在不同版本之间发生变化,因此我建议您编写单元测试以确保升级时不会中断。
API参考
Breadcrumbs 门面
定义面包屑
use App\Models\Post; use BlueSaltLabs\Breadcrumbs\BreadcrumbsGenerator; Breadcrumbs::before(function (BreadcrumbsGenerator $trail) { // ... }); Breadcrumbs::for('name', function (BreadcrumbsGenerator $trail, Post $post) { // ... }); Breadcrumbs::after(function (BreadcrumbsGenerator $trail) { // ... });
在视图(模板)中
@foreach ($breadcrumbs as $breadcrumb) {{-- ... --}} @endforeach
配置文件
config/breadcrumbs.php
常见问题解答
有新的 Laravel 版本 - 您能添加对其的支持吗?
自 5.3.2 版本以来,在 composer.json 中未指定 Laravel 的最大版本,因此大多数情况下它都会正常工作。
如果由于任何原因导致它损坏,它将在以下情况下得到修复:(1)有人 提交一个拉取请求 来修复它,或者(2)我决定升级我的应用程序 - 以先发生的为准。实际上,通常是因为前者,因为我通常不会在第一天升级。
为什么没有 Breadcrumbs::resource() 方法?
有几个人建议添加 Breadcrumbs::resource() 来匹配 Route::resource(),但没有人为其提出一个既足够灵活以处理翻译、嵌套资源等,又不会过于复杂的良好实现。
我个人认为没有好的全面解决方案,因此我建议您使用 Breadcrumbs::macro() 添加自己的。以下是一个起点
Breadcrumbs::macro('resource', function ($name, $title) { // Home > Blog Breadcrumbs::for("$name.index", function ($trail) use ($name, $title) { $trail->parent('home'); $trail->push($title, route("$name.index")); }); // Home > Blog > New Breadcrumbs::for("$name.create", function ($trail) use ($name) { $trail->parent("$name.index"); $trail->push('New', route("$name.create")); }); // Home > Blog > Post 123 Breadcrumbs::for("$name.show", function ($trail, $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 ($trail, $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 davejamesmiller/laravel-breadcrumbs以升级。 - 尝试运行
php artisan package:discover以确保服务提供器被 Laravel 识别。
未找到名为 ... 的面包屑
- 确保您在正确的位置注册了面包屑(默认为
routes/breadcrumbs.php)。- 尝试在文件中放入
dd(__FILE__)以确保它已加载。 - 尝试在
BreadcrumbsServiceProvider::registerBreadcrumbs()中放入dd($files)以检查路径是否正确。 - 如果不正确,尝试运行
php artisan config:clear(或手动删除bootstrap/cache/config.php)或在config/breadcrumbs.php中更新路径。
- 尝试在文件中放入
- 确保面包屑名称正确。
- 如果使用路由绑定面包屑,请确保它与路由名称完全匹配。
- 要使用路由绑定面包屑时抑制这些错误(如果您不希望在某些页面上显示面包屑),则可以
- 用空闭包(没有push/parent调用)注册它们,或者
- 在配置文件中将
missing-route-bound-breadcrumb-exception设置为false以禁用检查(但您不会收到任何页面的警告)。
BreadcrumbsServiceProvider::registerBreadcrumbs():无法打开所需...
- 请确保路径正确。
- 如果是这样,请检查文件的所有权 & 权限是否正确。
- 如果不正确,尝试运行
php artisan config:clear(或手动删除bootstrap/cache/config.php)或在config/breadcrumbs.php中更新路径。
未定义变量:breadcrumbs
- 请确保您使用
{{ Breadcrumbs::render() }}或{{ Breadcrumbs::view() }},而不是@include()。
不存在方法
- 您可能使用的是低于5.1的版本 - 使用
Breadcrumbs::register()而不是Breadcrumbs::for()(或者升级)。
其他问题
很抱歉这次无法帮助您,但一旦您解决了问题,请编辑此文件并提供解决方案,以帮助下一个遇到问题的人!
贡献
文档:如果您认为文档可以以任何方式改进,请编辑此文件并提交一个拉取请求。
错误修复:请修复它并打开一个拉取请求。(有关更详细的说明,请参阅下文。)如果您添加了单元测试以确保不会再次发生,将获得加分!
新功能:只有具有明确用例和经过良好考虑的API的功能才会被接受。它们必须被记录,并包括单元测试。如有疑问,请制作一个概念证明(可以是代码或文档),并提交一个拉取请求以讨论细节。(提示:如果您想要一个默认情况下无法包含的特定功能,请参阅宏或高级定制,了解添加它们的方法。)
创建拉取请求
在Laravel Breadcrumbs上工作的最简单方法是告诉Composer使用--prefer-source标志从源(Git)安装它
rm -rf vendor/davejamesmiller/laravel-breadcrumbs composer install --prefer-source
然后检出master分支,并创建自己的本地分支进行工作
cd vendor/davejamesmiller/laravel-breadcrumbs
git checkout -t origin/master
git checkout -b YOUR_BRANCH
现在进行更改,包括单元测试和文档(如果适用)。运行单元测试以确保一切正常
scripts/test.sh
然后提交更改。如果您尚未这样做,请在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: "davejamesmiller/laravel-breadcrumbs": "dev-YOUR_BRANCH" } }
将YOUR_USERNAME替换为您的GitHub用户名,将YOUR_BRANCH替换为分支名称(例如develop)。这将告诉Composer使用您的存储库而不是默认存储库。
单元测试
要运行单元测试
scripts/test.sh
要检查代码覆盖率
scripts/test-coverage.sh
然后打开 test-coverage/index.html 查看结果。请注意 PHPUnit 中的边缘情况,这可能导致结果不够准确。[边缘情况链接](https://phpunit.de/manual/current/en/code-coverage-analysis.html#code-coverage-analysis.edge-cases)。
新的 Laravel 版本
在 composer.json 中没有指定最大版本,因此不需要每隔 6 个月发布新的 Laravel Breadcrumbs 版本。然而,需要更新此文件以运行针对新版本的测试。
.travis.ymlmatrix(Laravel 版本)php(PHP 版本)exclude(不支持组合)
如果需要更改,也要更新
如果向后不兼容的更改导致 Laravel 或 PHP 的最低支持版本更改,则更新
composer.jsonphp/*illuminate/*
发布新版本
本节仅适用于维护者。
- 确保单元测试已更新且覆盖率达到 100%
- 如有必要,更新 测试应用程序,并手动测试它
- 确保 README 保持最新,包括
- 将更改合并到
master分支(如果需要) - 将代码更改推送到 GitHub(
git push) - 确保 所有测试均通过
- 标记发布版本(
git tag 1.2.3) - 推送标签(
git push --tag)
无技术支持
抱歉,我不提供任何技术支持,GitHub 问题已被禁用。这意味着我不会找出为什么它对你不起作用,我不会为你修复错误,也不会根据要求编写新功能——毕竟,这是一款 免费 软件。
但是,开源的魅力在于你可以随意使用它!你可以将其分支出来,修复它,改进它,并扩展它。如果你不想维护自己的分支,并且你认为其他人将从你的更改中受益,你可以提交一个 pull request,以便将你的更改包含在下一个版本中。
如果你真的陷入了困境,我建议你
- 阅读并重新阅读此文件和 Laravel 文档,看看你是否错过了什么。
- 深入研究源代码,花些时间了解它应该如何工作以及实际上发生了什么。
- 尝试在全新的 Laravel 项目中重现问题,以防它是与另一个包或其他代码的不兼容。
- 如果你在一个团队中工作,请你的同事帮助你调试。
- 请有更多经验的人帮助你(或者如果你在公司工作,请你的老板支付他们)。
- 尝试在 Stack Overflow、Laravel.io 论坛 或 Laracasts 论坛 上发表帖子(但我不能保证有人会回答——他们也没有得到报酬)。
- 使用不同的包。
- 自己编写。
变更日志
Laravel Breadcrumbs 使用 语义版本控制。
v5.3.2(2019 年 12 月 30 日星期一)
- 从 composer.json 中删除最大 Laravel 版本约束,以支持 Laravel 7+ 而无需每 6 个月发布一个新版本
v5.3.1(2019 年 10 月 20 日星期日)
- 为
Breadcrumbs门面添加 docblock(IDE Helper 的替代方案 – 感谢 Alexandr Chernyaev)
v5.3.0(2019年9月3日星期二)
- 添加 Laravel 6.x 支持
- 添加 Laravel Ignition 建议的解决方案
- 将
vendor:publish标签从config改为breadcrumbs-config以匹配 Horizon & Telescope 并简化命令
v5.2.1(2019年2月27日星期三)
- 添加 Laravel 5.8 支持(感谢 Andrew Dabich)
v5.2.0(2018年10月30日星期二)
- 添加 UIkit 模板(
breadcrumbs::uikit)(由 PieterHollevoet 提供的 #198)
v5.1.2(2018年9月14日星期五)
- 更新 默认配置文件,包含所有可用的视图列表
v5.1.1(2018年9月5日星期三)
- 添加 Laravel 5.7 支持
v5.1.0(2018年5月5日星期六)
- 将
Breadcrumbs::for($name, $callback)添加为Breadcrumbs::register($name, $callback)的别名 - 在文档中将
$breadcrumbs重命名为$trail(这不会影响代码)
这些更改受到(即直接来自)Dwight Watson 的 Breadcrumbs 包的启发。
从 5.0.0 升级到 5.1.0
不需要进行更改,但我建议您更新 routes/breadcrumbs.php 以匹配新的文档
- 将
Breadcrumbs::register替换为Breadcrumbs::for - 将
$breadcrumbs替换为$trail
v5.0.0(2018年2月10日星期六)
- 添加 Laravel 5.6 支持,并停止支持 Laravel 5.5
- 停止支持 PHP 7.0(添加
void返回类型提示,并使用[]替代list()) - 在使用 IDE Helper 时修复
Breadcrumbs门面的 PhpDoc 中的类名
从 4.x 升级到 5.x
- 升级到 Laravel 5.6(需要 PHP 7.1.3+)
- 如果您扩展了任何类,请在需要的地方添加
: void返回类型提示。
旧版本
许可证
版权所有 © 2013-2019 Dave James Miller
特此授予任何人获得此软件及其相关文档文件(“软件”)副本的许可,免费处理该软件,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或出售软件副本,并允许向提供软件的人员做上述事项,前提是遵守以下条件
上述版权声明和本许可声明应包含在软件的所有副本或主要部分中。
软件按“原样”提供,不提供任何形式的质量保证,包括但不限于适销性、特定用途的适用性和非侵权性保证。在任何情况下,作者或版权所有者均不对任何索赔、损害或其他责任承担责任,无论此类责任是基于合同、侵权或其他,是否与软件有关或与之有关、使用或其他方式。