davejamesmiller/laravel-breadcrumbs

此包已废弃,不再维护。作者建议使用diglactic/laravel-breadcrumbs包代替。

以Laravel风格简单创建导航路径。

5.3.2 2019-12-30 22:50 UTC

README

更新:2020年10月18日

现在有一个官方的Laravel Breadcrumbs分支
https://github.com/diglactic/laravel-breadcrumbs

博客文章
https://newsroom.diglactic.com/laravel-breadcrumbs/

感谢Diglactic的Sheng Slogar自愿承担此项目。

Dave

截至2020年4月18日,Laravel Breadcrumbs不再维护。

它可能还会工作一段时间 - 我已经从composer.json移除了版本约束,因此它将一直工作,直到Laravel的将来版本进行破坏性更改。

如果您想创建自己的分支,以修复错误或添加新功能,请参阅下面的说明。MIT许可证要求您保留版权声明和许可证信息,但除此之外,您可以随意使用代码和文档。

感谢在过去7年中帮助维护和添加功能的贡献者 - 我只是没有2013年那样维护开源项目(或写博客文章,或社交媒体)的能量,我决定是时候专注于新项目了。

Dave


Laravel Breadcrumbs

Latest Stable Version Total Downloads Monthly Downloads License
Latest Unstable Version Build Status Coverage Status

以Laravel风格简单创建导航路径。

目录

兼容性图表

Laravel Breadcrumbs Laravel PHP
5.3.2 5.6+ 7.1+
5.3.0 – 5.3.1 5.6 – 6.x 7.1+
5.2.1 5.6 – 5.8 7.1+
5.1.1 – 5.2.0 5.6 – 5.7 7.1+
5.0.0 – 5.1.0 5.6 7.1+
4.x 5.5 7.0+
3.x 5.0 – 5.4 5.4+
2.x 4.0 – 4.2 5.3+

入门

注意:如果您使用的是较旧版本,请在上面的表格中单击它以查看该版本的文档。

注意2:如果您认为本文档可以有任何改进,请编辑此文件并提交一个pull request。

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',

可能的值有:

有关更多详细信息,请参阅自定义模板部分。

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未找到页面,使用名称errors.404

// Error 404
Breadcrumbs::for('errors.404', function ($trail) {
    $trail->parent('home');
    $trail->push('Page Not Found');
});

在你的布局中输出面包屑

在你的布局文件中(例如 resources/views/app.blade.php)调用不带参数的Breadcrumbs::render()

{{ 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>

不要使用titleurl键,因为它们将被覆盖。

前后回调函数

您可以为在路径的开头/结尾添加面包屑注册"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>

要忽略一个面包屑,请将'current' => false添加到push()中的$data参数。这可以用来忽略分页面包屑。

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 DaveJamesMiller\Breadcrumbs\BreadcrumbsManager;
use Illuminate\Support\ServiceProvider;

class MyServiceProvider extends ServiceProvider
{
    public function register() {}

    public function boot(BreadcrumbsManager $breadcrumbs)
    {
        $breadcrumbs->register(...);
    }
}

BreadcrumbsManager 类是 macroable 的,因此您可以添加自己的方法。例如

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' => DaveJamesMiller\Breadcrumbs\BreadcrumbsManager::class,

    // Generator
    'generator-class' => DaveJamesMiller\Breadcrumbs\BreadcrumbsGenerator::class,

(注意: 以下内容不属于公共 API(见下文),它们可能在版本之间发生变化,因此建议您编写单元测试以确保升级时不会出错。)

API 参考

Breadcrumbs 门面

方法 返回 添加于
Breadcrumbs::for(string $name, closure $callback) void 5.1.0
Breadcrumbs::register(string $name, closure $callback) void 1.0.0
Breadcrumbs::before(closure $callback) void 4.0.0
Breadcrumbs::after(closure $callback) void 4.0.0
Breadcrumbs::exists() boolean 2.2.0
Breadcrumbs::exists(string $name) boolean 2.2.0
Breadcrumbs::generate() Collection 2.2.3
Breadcrumbs::generate(string $name) Collection 1.0.0
Breadcrumbs::generate(string $name, mixed $param1, ...) Collection 1.0.0
Breadcrumbs::render() string 2.2.0
Breadcrumbs::render(string $name) string 1.0.0
Breadcrumbs::render(string $name, mixed $param1, ...) string 1.0.0
Breadcrumbs::view(string $view) string 4.0.0
Breadcrumbs::view(string $view, string $name) string 4.0.0
Breadcrumbs::view(string $view, string $name, mixed $param1, ...) string 4.0.0
Breadcrumbs::setCurrentRoute(string $name) void 2.2.0
Breadcrumbs::setCurrentRoute(string $name, mixed $param1, ...) void 2.2.0
Breadcrumbs::clearCurrentRoute() void 2.2.0

源代码

定义面包屑

use App\Models\Post;
use DaveJamesMiller\Breadcrumbs\BreadcrumbsGenerator;

Breadcrumbs::before(function (BreadcrumbsGenerator $trail) {
    // ...
});

Breadcrumbs::for('name', function (BreadcrumbsGenerator $trail, Post $post) {
    // ...
});

Breadcrumbs::after(function (BreadcrumbsGenerator $trail) {
    // ...
});
方法 返回 添加于
$trail->push(string $title) void 1.0.0
$trail->push(string $title, string $url) void 1.0.0
$trail->push(string $title, string $url, array $data) void 2.3.0
$trail->parent(string $name) void 1.0.0
$trail->parent(string $name, mixed $param1, ...) void 1.0.0

源代码

在视图(模板)中

@foreach ($breadcrumbs as $breadcrumb)
    {{-- ... --}}
@endforeach
变量 类型 添加于
$breadcrumb->title string 1.0.0
$breadcrumb->url string / null 1.0.0
$breadcrumb->custom_attribute_name mixed 2.3.0

源代码

配置文件

config/breadcrumbs.php

设置 类型 添加于
view string 2.0.0
files string / array 4.0.0
unnamed-route-exception boolean 4.0.0
missing-route-bound-breadcrumb-exception boolean 4.0.0
invalid-named-breadcrumb-exception boolean 4.0.0
manager-class string 4.2.0
generator-class string 4.2.0

源代码

常见问题解答

有新的 Laravel 版本 - 您能添加对其的支持吗?

从5.3.2版本开始,在composer.json中没有指定Laravel的最大版本,所以大多数情况下它将正常工作。

如果由于任何原因出现故障,它将在以下情况下得到修复:(1)有人提交pull request来修复它,或者(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属性(用户可能没有)。请根据您的需要调整。

故障排除

一般

  • 重新阅读说明并确保您已经正确执行了所有操作。
  • 从简单的选项开始,只有在理解了其工作原理后,才使用高级选项(例如,Route-Bound Breadcrumbs)。

找不到类'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中的路径。
  • 确保面包屑名称正确。
    • 如果使用Route-Bound Breadcrumbs,请确保它与路由名称完全匹配。
  • 要使用Route-Bound Breadcrumbs时抑制这些错误(如果您不想在某些页面上显示面包屑),则

BreadcrumbsServiceProvider::registerBreadcrumbs(): Failed opening required ...

  • 确保路径正确。
  • 如果是这样,请检查文件所有权和权限是否正确。
  • 如果不正确,尝试运行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 [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:
        "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 中的 边缘情况,这可能会使其不完全准确。

Laravel 的新版本

composer.json中未指定最大版本,因此无需每6个月发布一个新的Laravel Breadcrumbs版本。然而,此文件需要更新以运行对新版本的测试。

  • .travis.yml
    • matrix(Laravel版本)
    • php(PHP版本)
    • exclude(不受支持的组合)

如果需要更改,也请更新

如果向后不兼容的更改导致Laravel或PHP的最低支持版本发生变化,请更新

发布新版本

本节仅适用于维护者。

  • 确保单元测试已更新且覆盖率为100%
  • 如果适用,更新测试应用程序并手动测试
  • 确保README是最新的,包括
  • 将更改合并到master分支(如果需要)
  • 将代码更改推送到GitHub(git push
  • 确保所有测试都通过
  • 标记发布(git tag 1.2.3
  • 推送标签(git push --tag

无技术支持

很抱歉,我不提供任何技术支持,GitHub问题已被禁用。这意味着我不会找出为什么它对你不起作用,我不会为你修复错误,也不会根据请求编写新功能——毕竟,这是一个免费软件。

但是开源之美在于你可以随意使用它!你可以将其分支出来,修复它,改进它并扩展它。如果你不想维护你自己的分支,并且你认为其他人会从你的更改中受益,你可以提交一个pull request以将你的更改包含在下一个版本中。

如果你真的陷入困境,我建议你

  1. 阅读并重新阅读这两个文件以及Laravel文档,看你是否错过了什么。
  2. 深入研究源代码,花些时间弄清楚它应该如何工作以及实际上发生了什么。
  3. 尝试在一个全新的Laravel项目上重现问题,以防它是与其他包或你的其他代码的不兼容性。
  4. 如果你在一个团队工作,请你的同事帮助你调试。
  5. 支付经验更丰富的人来帮助你(或者如果你在公司工作,请你的老板支付他们)。
  6. 尝试在Stack OverflowLaravel.io论坛Laracasts论坛上发布帖子(但我不能保证有人会回答——他们也没有得到报酬)。
  7. 使用不同的包。
  8. 自己编写。

变更日志

Laravel Breadcrumbs使用语义版本控制

v5.3.2(星期一,2019年12月30日)

  • 从composer.json中移除最大Laravel版本限制,以支持Laravel 7及以上版本,无需每6个月发布新版本。

v5.3.1 (星期日 20 十月 2019)

  • Breadcrumbs外观添加docblock(IDE Helper的替代方案 – 感谢Alexandr Chernyaev

v5.3.0 (星期二 3 九月 2019)

  • 添加Laravel 6.x支持
  • 添加Laravel Ignition建议的解决方案
  • vendor:publish标签从config更改为breadcrumbs-config以匹配Horizon & Telescope,并简化命令

v5.2.1 (星期三 27 二月 2019)

v5.2.0 (星期二 30 十月 2018)

v5.1.2 (星期五 14 九月 2018)

v5.1.1 (星期三 5 九月 2018)

  • 添加Laravel 5.7支持

v5.1.0 (星期六 5 五月 2018)

  • 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 (星期六 10 二月 2018)

  • 添加Laravel 5.6支持,并停止对Laravel 5.5的支持
  • 停止对PHP 7.0的支持(添加void返回类型提示,并使用[]代替list()
  • 修复使用IDE HelperBreadcrumbs外观的类名在PhpDoc中的问题

从 4.x 升级到 5.x

  • 升级到 Laravel 5.6(需要 PHP 7.1.3+)
  • 如果您正在扩展任何类,需要在需要的地方添加 : void 返回类型提示。

旧版本

许可证

MIT 许可证

版权所有 © 2013-2019 Dave James Miller

以下条件允许任何人免费获得本软件及其相关文档副本(“软件”),在软件上不受限制地操作,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件副本,并允许将软件提供给其他人使用,前提是遵守以下条件

上述版权声明和本许可声明应包含在软件的所有副本或主要部分中。

软件按“原样”提供,不提供任何形式的保证,无论是明示的、暗示的,还是关于适销性、特定用途适用性或非侵权的保证。在任何情况下,作者或版权所有者不应对任何索赔、损害或其他责任承担责任,无论此类责任是因合同、侵权或其他原因而引起的,不论是否与软件或其使用或其他操作有关。