n1215 / larabread
为Laravel设计的IDE友好型面包屑包
0.1.0
2020-04-23 12:27 UTC
Requires
- php: >=7.1.3
- ext-json: *
- illuminate/container: >=5.6
- illuminate/support: >=5.6
- illuminate/view: >=5.6
- psr/container: ^1.0
Requires (Dev)
- phpunit/phpunit: ^8.0
This package is auto-updated.
Last update: 2024-09-23 22:09:04 UTC
README
为Laravel设计的IDE友好型面包屑包。
安装
composer require n1215/larabread
用法
1. 工厂和方法链
- routes/web.php
Route::get('path/to/page', 'AppController@page');
- app/Http/Controllers/AppController.php
<?php declare(strict_types=1); namespace App\Http\Controllers; use Illuminate\Contracts\View\View; use N1215\Larabread\BreadcrumbListFactory; class AppController { public function page(BreadcrumbListFactory $factory): View { // create BreadcrumbList instance with BreadcrumbListFactory::make() and BreadcrumbList::add() method $breadcrumbs = $factory->make() ->add('Home', '/') ->add('Path', '/path') ->add('To', '/path/to') ->add('Page', '/path/to/page'); // pass BreadcrumbList to a blade template. the variable name should be 'breadcrumbs' return view('page', compact('breadcrumbs')); } }
- resources/views/page.blade.php
// include default template @include(config('larabread.templates.default'))
使用默认模板(使用bootstrap4 CSS类)渲染HTML。默认模板。
<nav aria-label="breadcrumb"> <ol class="breadcrumb"> <li class="breadcrumb-item"><a href="/">Home</a></li> <li class="breadcrumb-item"><a href="/path">Path</a></li> <li class="breadcrumb-item"><a href="/path/to">To</a></li> <li class="breadcrumb-item active">Page</li> </ol> </nav>
2. 路径类
您可以通过创建名为"Trail"的POPO类在控制器外定义面包屑。
2-1. 简单路径
- app/Http/Breadcrumbs/AppTrail.php
<?php declare(strict_types=1); namespace App\Http\Breadcrumbs; use N1215\Larabread\BreadcrumbList; use N1215\Larabread\BreadcrumbListFactory; class AppTrail { /** * @var BreadcrumbListFactory */ private $factory; // inject BreadcrumbListFactory public function __construct(BreadcrumbListFactory $factory) { $this->factory = $factory; } // create method which returns BreadcrumbList public function page(): BreadcrumbList { return $this->factory->make() ->add('Home', '/') ->add('Path', '/path') ->add('To', '/path/to') ->add('Page', '/path/to/page'); } }
- app/Http/Controllers/AppController.php
<?php declare(strict_types=1); namespace App\Http\Controllers; use App\Http\Breadcrumbs\AppTrail; use Illuminate\Contracts\View\View; class AppController { // inject AppTrail public function page(AppTrail $trail): View { $breadcrumbs = $trail->page(); return view('page', compact('breadcrumbs')); } }
2-2. 嵌套定义
您可以通过方法链重用其他面包屑列表。
- app/Http/Breadcrumbs/AppTrail.php
<?php declare(strict_types=1); namespace App\Http\Breadcrumbs; use N1215\Larabread\BreadcrumbList; use N1215\Larabread\BreadcrumbListFactory; class AppTrail { /** * @var BreadcrumbListFactory */ private $factory; public function __construct(BreadcrumbListFactory $factory) { $this->factory = $factory; } public function home(): BreadcrumbList { return $this->factory->make()->add('Home', '/'); } public function path(): BreadcrumbList { // you can reuse other BreadcrumbList as a parent return $this->home()->add('Path', '/path'); } public function to(): BreadcrumbList { return $this->path()->add('To', '/path/to'); } public function page(): BreadcrumbList { return $this->to()->add('Page', '/path/to/page'); } }
- app/Http/Controllers/AppController.php
<?php declare(strict_types=1); namespace App\Http\Controllers; use App\Http\Breadcrumbs\AppTrail; use Illuminate\Contracts\View\View; class AppController { /** * @var AppTrail */ private $trail; public function __construct(AppTrail $trail) { $this->trail = $trail; } public function home(): View { return view('home', ['breadcrumbs' => $this->trail->home()]); } public function path(): View { return view('path', ['breadcrumbs' => $this->trail->path()]); } public function to(): View { return view('to', ['breadcrumbs' => $this->trail->to()]); } public function page(): View { return view('to', ['breadcrumbs' => $this->trail->page()]); } }
2-3. 通过构造函数注入的嵌套定义
您可以将定义分散到多个路径类中。
- app/Http/Breadcrumbs/HomeTrail.php
<?php declare(strict_types=1); namespace App\Http\Breadcrumbs; use N1215\Larabread\BreadcrumbList; use N1215\Larabread\BreadcrumbListFactory; class HomeTrail { /** * @var BreadcrumbListFactory */ private $factory; public function __construct(BreadcrumbListFactory $factory) { $this->factory = $factory; } public function home(): BreadcrumbList { return $this->factory->make()->add('Home', '/'); } }
- app/Http/Breadcrumbs/PathTrail.php
<?php declare(strict_types=1); namespace App\Http\Breadcrumbs; use N1215\Larabread\BreadcrumbList; class PathTrail { /** * @var HomeTrail */ private $from; // inject HomeTrail in the constructor public function __construct(HomeTrail $from) { $this->from = $from; } public function path(): BreadcrumbList { return $this->from->home()->add('Path', '/path'); } }
通过服务容器和自动绑定解决路径类之间的父子关系。
- app/Http/Controllers/AppController.php
<?php declare(strict_types=1); namespace App\Http\Controllers; use App\Http\Breadcrumbs\HomeTrail; use App\Http\Breadcrumbs\PathTrail; use Illuminate\Contracts\View\View; class AppController { public function home(HomeTrail $trail): View { return view('home', ['breadcrumbs' => $trail->home()]); } public function path(PathTrail $trail): View { return view('path', ['breadcrumbs' => $trail->path()]); } }
3. 以其他方式创建面包屑列表。
一个简单的博客系统示例,使用类别和帖子模型。
- routes/web.php
Route::get('home', 'AppController@home')->name('home'); Route::get('categories', 'CategoriesController@index')->name('categories.index'); Route::get('categories/{category}', 'CategoriesController@index')->name('categories.show'); Route::get('categories/{category}/posts', 'PostsController@index')->name('categories.posts.index'); Route::get('categories/{category}/posts/{post}', 'PostsController@show')->name('categories.posts.show');
- app/Models/Post.php
<?php declare(strict_types=1); namespace App\Models; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; /** * Blog Post * @property int $id * @property int $category_id * @property string $title * @property string $body * @property-read Category $category */ class Post extends Model { public function category(): BelongsTo { return $this->belongsTo(Category::class); } }
- app/Models/Category.php
<?php declare(strict_types=1); namespace App\Models; use Illuminate\Database\Eloquent\Collection; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\HasMany; /** * Blog Category * @property int $id * @property string $title * @property-read Collection<Post> $posts */ class Category extends Model { public function posts(): HasMany { return $this->hasMany(Post::class); } }
- app/Http/Breadcrumbs/HomeTrail.php
<?php declare(strict_types=1); namespace App\Http\Breadcrumbs; use N1215\Larabread\BreadcrumbList; use N1215\Larabread\BreadcrumbListFactory; class HomeTrail { /** * @var BreadcrumbListFactory */ private $factory; public function __construct(BreadcrumbListFactory $factory) { $this->factory = $factory; } public function home(): BreadcrumbList { return $this->factory->make()->add('Home', '/'); } }
- app/Http/Breadcrumbs/CategoriesTrail.php
<?php declare(strict_types=1); namespace App\Http\Breadcrumbs; use App\Models\Category; use N1215\Larabread\BreadcrumbList; class CategoriesTrail { /** * @var HomeTrail */ private $from; public function __construct(HomeTrail $from) { $this->from = $from; } public function index(): BreadcrumbList { return $this->from->home() ->add('Categories', route('categories.index')); } // any parameters can be passed to Trail methods public function show(Category $category): BreadcrumbList { return $this->index() ->add($category->title, route('categories.show', ['category' => $category->id])); } }
- app/Http/Breadcrumbs/PostTrail.php
<?php declare(strict_types=1); namespace App\Http\Breadcrumbs; use App\Models\Category; use App\Models\Post; use N1215\Larabread\BreadcrumbList; class PostsTrail { /** * @var CategoriesTrail */ private $from; public function __construct(CategoriesTrail $from) { $this->from = $from; } public function index(Category $category): BreadcrumbList { return $this->from->show($category) ->add('Posts', route('categories.posts.index')); } public function show(Post $post): BreadcrumbList { return $this->index($post->category) ->add($post->title, route('categories.posts.show', ['category' => $post->category_id, 'post' => $post->id])); } }
- app/Http/Controllers/PostsController.php
您可以通过4种方式创建面包屑列表
- (1) 使用注入的路径类
- (2) 使用注入的面包屑管理器类
- (3) 使用面包屑外观
- (4) 使用breadcrumbs()助手
BreadcrumbManager::make()的第一个参数是路径类名称及其方法名称的数组。随后的参数传递给路径的方法。
<?php declare(strict_types=1); namespace App\Http\Controllers; use App\Http\Breadcrumbs\PostsTrail; use App\Models\Category; use App\Models\Post; use Illuminate\Contracts\View\View; use N1215\Larabread\BreadcrumbManager; use N1215\Larabread\Facades\Breadcrumbs; class PostsController { /** * @var PostsTrail */ private $postsTrail; public function __construct(PostsTrail $postsTrail) { $this->postsTrail = $postsTrail; } public function index(int $categoryId): View { /** @var Category $category */ $category = Category::query()->findOrFail($categoryId); $posts = $category->posts; $breadcrumbs = $this->postsTrail->index($category); return view('categories.index', compact('category', 'posts', 'breadcrumbs')); } public function show(int $categoryId, int $postId, PostsTrail $postsTrail, BreadcrumbManager $breadcrumbManager): View { /** @var Post $post */ $post = Post::query()->where('category_id', $categoryId)->findOrFail($postId); // (1) make a BreadcrumbList instance from an injected instance of Trail class $breadcrumbs = $postsTrail->show($post); // (2) make a BreadcrumbLIst instance from an injected instance of BreadcrumbManager $breadcrumbs = $breadcrumbManager->make([PostsTrail::class, 'show'], $post); // (3) make a BreadcrumbList instance from Facade $breadcrumbs = Breadcrumbs::make([PostsTrail::class, 'show'], $post); // (4) make a BreadcrumbList instance from helper function $breadcrumbs = breadcrumbs()->make([PostsTrail::class, 'show'], $post); return view('categories.index', compact('post', 'breadcrumbs')); } }
4. 在Blade模板中创建面包屑列表。
您可以直接在Blade模板中创建面包屑列表。
@php // using Facade $breadcrumbs = Breadcrumbs::make([\App\Http\Breadcrumbs\PostsTrail::class, 'show'], $post); // using helper $breadcrumbs = breadcrumbs()->make([\App\Http\Breadcrumbs\PostsTrail::class, 'show'], $post); @endphp @include(config('larabread.templates.default'))
5. 设置当前面包屑列表
面包屑管理器可以为当前请求保留面包屑列表。
- resources/layouts/default.blade.php
在布局文件中包含面包屑模板。
<!DOCTYPE html> <html lang="{{ str_replace('_', '-', app()->getLocale()) }}"> <head> <meta charset="utf-8"> <title>@yield('title')</title> </head> <body> @include(config('larabread.templates.default')) <div> @yield('content') </div> </body> </html>
通过外观或助手在子模板中调用BreadcrumbManager::set()。参数与BreadcrumbManager::make()相同。
设置当前面包屑列表后,可以通过BreadcrumbManager::get()获取它,并且当前面包屑列表自动通过视图组合器添加到面包屑模板中。
@extends('layouts.default') @php breadcrumbs()->set([\App\Http\Breadcrumbs\PostsTrail::class, 'show'], $post); @endphp @section('title', breadcrumbs()->get()->last()->getTitle()) @section('content') {{-- --}} @endsection
6. 更改模板
默认模板在配置文件中设置。
6-1. 发布配置文件
将包的配置发布到config/larabread.php。
php artisan vendor:publish --tag=larabread-config
6-2. 更改配置文件
- config/larabread.pph
<?php return [ // view variable name 'variable_name' => 'breadcrumbs', // inject breadcrumbs into these blade templates via view composer 'templates' => [ 'default' => 'elements.breadcrumbs', // change here ], ];
6-3 编写自己的模板文件
- resources/vies/elements/breadcrumbs.blade.php
@php /** * @var \N1215\Larabread\BreadcrumbList $breadcrumbs * @var \N1215\Larabread\Breadcrumb $breadcrumb */ @endphp @if (isset($breadcrumbs) && !$breadcrumbs->isEmpty()) <nav aria-label="breadcrumb"> <ol class="breadcrumb"> @foreach ($breadcrumbs as $breadcrumb) @if ($breadcrumb->getUrl() !== null && !$loop->last) <li class="breadcrumb-item"><a href="{{ $breadcrumb->getUrl() }}">{{ $breadcrumb->getTitle() }}</a></li> @else <li class="breadcrumb-item active">{{ $breadcrumb->getTitle() }}</li> @endif @endforeach </ol> </nav> @endif
6-4. 自定义属性
BreadcrumbList::add()的第三个参数是自定义属性。例如,添加一个图标图像URL。
<?php declare(strict_types=1); namespace App\Http\Breadcrumbs; use N1215\Larabread\BreadcrumbList; class PathTrail { /** * @var HomeTrail */ private $from; public function __construct(HomeTrail $from) { $this->from = $from; } public function path(): BreadcrumbList { return $this->from->home()->add('Path', '/path', ['icon' => 'https://example.com/path.png']); } }
使用Breadcrumb::getAttribute()方法使用属性。
@php /** * @var \N1215\Larabread\BreadcrumbList $breadcrumbs * @var \N1215\Larabread\Breadcrumb $breadcrumb */ @endphp @if (isset($breadcrumbs) && !$breadcrumbs->isEmpty()) <nav aria-label="breadcrumb"> <ol class="breadcrumb"> @foreach ($breadcrumbs as $breadcrumb) <img src="{{ $breadcrumb->getAttribute('icon', 'default.png') }}" alt="{{ $breadcrumb->getTitle() }}"> @endforeach </ol> </nav> @endif
许可证
MIT许可证(MIT)。有关更多信息,请参阅LICENSE。