diglactic/laravel-breadcrumbs

创建面包屑的一种简单Laravel风格方法。

v9.0.0 2024-03-12 00:42 UTC

README

Laravel Breadcrumbs

Build Status Total Downloads Latest Stable Version License

简介

创建面包屑的一种简单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',

可能的值包括

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

您还可以在运行时指定自定义视图

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 文档中的 资源控制器

(相关常见问题解答: 为什么没有 Breadcrumbs::resource() 方法?。)

高级使用

无 URL 的面包屑

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>

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

前后回调

您可以注册“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>

要忽略一个面包屑,请将 '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 的 集合类 方法

<?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';
        }
    }
}

依赖注入

如果您更喜欢使用 Breadcrumbs:: 外观而不是直接使用 Manager 实例,您可以使用 依赖注入

<?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 中更新路径。
  • 确保面包屑名称正确。
    • 如果使用路由绑定面包屑,确保它与路由名称完全匹配。
  • 当使用路由绑定面包屑时(如果您不希望某些页面上有面包屑),可以

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 [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版本

以下文件需要更新以在新版本的Laravel上运行测试

  • composer.json

    • laravel/framework(Laravel版本)
    • php(最低PHP版本)
    • 其他依赖项(建议升级到适用于所有Laravel/PHP组合的最高可用版本)
  • tests.yml

    • jobs.phpunit.strategy.matrix.laravel(Laravel版本)
    • jobs.phpunit.strategy.matrix.php(PHP版本)
    • jobs.phpunit.strategy.matrix.exclude(不支持的组合)

以及以下文档,如有需要

许可证

Laravel Breadcrumbs是开源软件,许可协议为MIT协议。