tabuna/breadcrumbs

为您的Laravel应用轻松添加面包屑。

4.1.0 2024-03-14 02:01 UTC

This package is auto-updated.

Last update: 2024-09-14 03:13:29 UTC


README

Laravel Breadcrumbs

Tests codecov Total Downloads Latest Version on Packagist

简介

面包屑显示一系列链接,指示当前页面在整个网站层次结构中的位置。例如,如“首页 / 示例文章 / 编辑”这样的面包屑表示用户正在查看“示例文章”的编辑页面。他可以点击“示例文章”查看该页面,或点击“首页”返回首页。

首页 / 示例文章 / 编辑

此包为 Laravel 框架 制作,可轻松在应用中构建面包屑。

安装

在命令行中运行以下命令

$ composer require tabuna/breadcrumbs

这将更新 composer.json 并将包安装到 vendor/ 目录中。

定义您的面包屑

现在您可以直接在路由文件中定义面包屑

use Tabuna\Breadcrumbs\Trail;

// Home
Route::get('/', fn () => view('home'))
    ->name('home')
    ->breadcrumbs(fn (Trail $trail) =>
        $trail->push('Home', route('home'))
);

// Home > About
Route::get('/about', fn () => view('home'))
    ->name('about')
    ->breadcrumbs(fn (Trail $trail) =>
        $trail->parent('home')->push('About', route('about'))
);

您也可以从请求中获取参数

Route::get('/category/{category}', function (Category $category){
    //In this example, the category object is your Eloquent model.
    //code...
})
    ->name('category')
    ->breadcrumbs(fn (Trail $trail, Category $category) =>
        $trail->push($category->title, route('category', $category->id))
);

路由检测

该包尝试减少所需行数。为此,您可以选择不传递 route() 方法的返回结果。以下两个声明将是等效的

Route::get('/', fn () => view('home'))
    ->name('home')
    ->breadcrumbs(fn (Trail $trail) =>
        $trail->push('Home', route('home'))
);

Route::get('/', fn () => view('home'))
    ->name('home')
    ->breadcrumbs(fn (Trail $trail) =>
        $trail->push('Home', 'home')
);

喜欢使用单独的路由文件吗?

您只需将所需的文件添加到服务提供器中即可完成此操作

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class BreadcrumbsServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap the application events.
     *
     * @return void
     */
    public function boot()
    {
        require base_path('routes/breadcrumbs.php');
    }
}

然后它将成为路由目录中的特殊文件

// routes/breadcrumbs.php


// Photos
Breadcrumbs::for('photo.index', fn (Trail $trail) =>
    $trail->parent('home')->push('Photos', route('photo.index'))
);

路由资源

当使用资源时,会为必须手动指定值的整个路由组声明路由

// routes/web.php

Route::resource('photos', 'PhotoController');

最好在服务提供器中指定此内容,因为路由文件可能会被缓存

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Tabuna\Breadcrumbs\Breadcrumbs;
use Tabuna\Breadcrumbs\Trail;

class BreadcrumbsServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        Breadcrumbs::for('photos.index', fn (Trail $trail) =>
             $trail->push('Photos', route('home'))
        );
        
        Breadcrumbs::for('photos.create', fn (Trail $trail) =>
            $trail
                ->parent('photos.index', route('photos.index'))
                ->push('Add new photo', route('home'))
        );
    }
}

使用Blade组件输出面包屑

您可以使用输出组件

<ul>
    <x-tabuna-breadcrumbs/>
</ul>

要定义列表项的类,可以指定

<x-tabuna-breadcrumbs
  class="item"
  active="active"
/>

您还可以传递参数

<x-tabuna-breadcrumbs
    parameters="['value 1', 'value 2', 'value 3']"
/>

并明确调用命名路由

<x-tabuna-breadcrumbs
    route="static"
/>

使用Blade视图输出面包屑

为了在所需的页面上显示面包屑,只需调用

@if(Breadcrumbs::has())
    @foreach (Breadcrumbs::current() as $crumbs)
        @if ($crumbs->url() && !$loop->last)
            <li class="breadcrumb-item">
                <a href="{{ $crumbs->url() }}">
                    {{ $crumbs->title() }}
                </a>
            </li>
        @else
            <li class="breadcrumb-item active">
                {{ $crumbs->title() }}
            </li>
        @endif
    @endforeach
@endif

结果如下所示

首页 / 关于

致谢

多年来,我成功使用了 Dave James Miller 的包来解决我的问题,但他停止了开发和支持。经过长时间的搜索,我喜欢 Dwight Watson 的包,但面包屑与路由公告的隔离没有让我满意。这就是我创建这个包的原因。它使用了前两个包的代码。

许可

MIT 许可证 (MIT)。请参阅 许可文件 以获取更多信息。