bluesalt-labs/laravel-breadcrumbs

创建面包屑的简单Laravel风格方法。由davejamesmiller/laravel-breadcrumbs分支而来

5.3.3 2020-04-22 18:56 UTC

README

由于我正在积极使用此存储库,因此我创建了分支以修复可能出现的任何破坏性更改。这不是真正的维护,但将允许活跃的项目继续使用此包。我将尽我所能(和时间)将使用此包的项目保持与PHP和Laravel的最新版本同步,因此如果其他人有兴趣使用它,它应该会继续工作。

原始文档

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

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

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

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

戴夫


Laravel Breadcrumbs

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

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

可能的值是

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

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>

不要使用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>

要忽略一个面包屑,在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 中更新路径。
  • 确保面包屑名称正确。
    • 如果使用路由绑定面包屑,请确保它与路由名称完全匹配。
  • 要使用路由绑定面包屑时抑制这些错误(如果您不希望在某些页面上显示面包屑),则可以

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.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(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日星期三)

v5.2.0(2018年10月30日星期二)

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 返回类型提示。

旧版本

许可证

MIT 许可证

版权所有 © 2013-2019 Dave James Miller

特此授予任何人获得此软件及其相关文档文件(“软件”)副本的许可,免费处理该软件,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或出售软件副本,并允许向提供软件的人员做上述事项,前提是遵守以下条件

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

软件按“原样”提供,不提供任何形式的质量保证,包括但不限于适销性、特定用途的适用性和非侵权性保证。在任何情况下,作者或版权所有者均不对任何索赔、损害或其他责任承担责任,无论此类责任是基于合同、侵权或其他,是否与软件有关或与之有关、使用或其他方式。