synergitech / laravel-breadcrumbs
Requires
- php: >=7.1.3
- illuminate/support: 5.6.*|5.7.*
- illuminate/view: 5.6.*|5.7.*
Requires (Dev)
- laravel/framework: 5.6.*|5.7.*
- orchestra/testbench: 3.6.*|3.7.*
- php-coveralls/php-coveralls: ^1.0
- phpunit/phpunit: 7.*
README
创建面包屑的简单 Laravel 风格方法。
目录
兼容性图表
Laravel 面包屑 | Laravel | PHP |
---|---|---|
5.x | 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+ |
入门指南
注意:如果您使用的是较旧版本,请在上面的表格中单击它以查看该版本的文档。
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 --provider="DaveJamesMiller\Breadcrumbs\BreadcrumbsServiceProvider"
然后打开 config/breadcrumbs.php
并编辑此行
'view' => 'breadcrumbs::bootstrap4',
可能的值包括
breadcrumbs::bootstrap4
– Bootstrap 4breadcrumbs::bootstrap3
– Bootstrap 3breadcrumbs::bootstrap2
– Bootstrap 2breadcrumbs::bulma
– Bulmabreadcrumbs::foundation6
– Foundation 6breadcrumbs::materialize
– Materializebreadcrumbs::json-ld
– JSON-LD 结构化数据 (<script> 标签,无可见输出)- 自定义视图的路径:例如
partials.breadcrumbs
请参阅自定义模板部分以获取更多详细信息。
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
变量将从视图中简单传递
{{ 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'))
在布局(例如 resources/views/app.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页面(404 Not Found页面),请使用名称 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::view()
$breadcrumbs = Breadcrumbs::generate();
并且对于 Breadcrumbs::view()
{{ Breadcrumbs::view('breadcrumbs::json-ld') }}
路由绑定异常
如果面包屑不存在,将抛出 InvalidBreadcrumbException
异常,以提醒您创建一个。为防止这种情况,首先初始化配置文件,如果您还没有的话
php artisan vendor:publish --provider="DaveJamesMiller\Breadcrumbs\BreadcrumbsServiceProvider"
然后打开 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文档中的资源控制器。
高级用法
无URL的面包屑
push()
方法的第二个参数是可选的,因此如果您想创建一个没有URL的面包屑,可以这样做
$trail->push('Sample');
$breadcrumb->url
的值将是 null
。
默认的Twitter 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>
不要使用键 title
或 url
,因为它们将被覆盖。
前后回调
您可以注册 "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)])
覆盖 "current" 路由
如果您不带参数调用 Breadcrumbs::render()
或 Breadcrumbs::generate()
,它将默认使用当前路由名称和参数(如 Laravel 的 Route::current()
方法返回的)。
您可以通过调用 Breadcrumbs::setCurrentRoute($name, $param1, $param2...)
来覆盖此设置。
检查面包屑是否存在
要检查具有给定名称的面包屑是否存在,请调用 Breadcrumbs::exists('name')
,它返回一个布尔值。
在另一个文件中定义面包屑
如果您不想使用 routes/breadcrumbs.php
,您可以在配置文件中更改它。首先初始化配置文件,如果您还没有这样做的话
php artisan vendor:publish --provider="DaveJamesMiller\Breadcrumbs\BreadcrumbsServiceProvider"
然后打开 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 类是 可宏定义的,因此您可以添加自己的方法。例如
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 |
配置
设置 | 类型 | 添加于 |
---|---|---|
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 Breadcrumbs使用语义化版本控制。
v5.1.0 (Sat 5 May 2018)
- 添加
Breadcrumbs::for($name, $callback)
作为Breadcrumbs::register($name, $callback)
的别名 - 在文档中将
$breadcrumbs
重命名为$trail
(这不会影响代码)
这些更改受到了(即直接从)Dwight Watson的面包屑包的启发。
从5.0.0升级到5.1.0
无需进行更改,但建议您更新您的routes/breadcrumbs.php
以匹配新的文档
- 将
Breadcrumbs::register
替换为Breadcrumbs::for
- 将
$breadcrumbs
替换为$trail
v5.0.0 (Sat 10 Feb 2018)
- 添加Laravel 5.6支持,并取消对Laravel 5.5的支持
- 取消对PHP 7.0的支持(添加
void
返回类型提示,并使用[]
代替list()
) - 在PhpDoc中使用IDE Helper时修复
Breadcrumbs
门面的类名
从4.x升级到5.x
- 升级到 Laravel 5.6 (需要 PHP 7.1.3+)
- 如果你正在扩展任何类,请在需要的地方添加
: void
返回类型提示。
旧版本
技术支持
抱歉,我不提供技术支持。我花费了大量时间构建 Laravel Breadcrumbs 和编写文档,并将其免费提供给你。请不要期望我也为你解决问题。
我坚信,花时间解决自己的问题是学习的最佳方式,但如果你真的卡住了,我建议你尝试在 Stack Overflow、Laravel.io 论坛 或 Laracasts 论坛 上发布一个问题。
错误报告
请在 GitHub 上 创建一个问题。但请记住,这是一个免费的软件,因此 我不保证修复任何错误 - 如果我有时间和动力,我会调查是否需要这样做。不要害怕进入 Laravel Breadcrumbs 代码(vendor/davejamesmiller/laravel-breadcrumbs/src/
),使用 var_dump()
看看发生了什么,并自己解决问题(如果适当,可以提交一个带有修复的 pull request)。
贡献
错误修复:请修复它并创建一个 pull request。如果你添加了一个单元测试以确保它不会再次发生,那么将获得额外的加分!
新功能:只有具有明确用例和经过良好考虑的 API 的高价值功能才会被接受。它们必须得到文档说明并包括单元测试。我建议你首先在 issue 中讨论这个想法。
文档:如果你认为文档可以在任何方面得到改进,请 编辑此文件 并创建一个 pull request。
在您的应用程序内开发
在您现有的应用程序中处理 Laravel Breadcrumbs 的最简单方法是通过告诉 Composer 使用 --prefer-source
标志从源(Git)安装。
rm -rf vendor/davejamesmiller/laravel-breadcrumbs composer install --prefer-source
然后
cd vendor/davejamesmiller/laravel-breadcrumbs git checkout -t origin/master # Make changes and commit them git checkout -b YOUR_BRANCH git remote add YOUR_USERNAME git@github.com:YOUR_USERNAME/laravel-breadcrumbs.git git push -u YOUR_USERNAME YOUR_BRANCH
在项目中使用您的分支
要使用您自己的分支在项目中,按照以下方式更新您主项目中的 composer.json
:
{ "repositories": [ { "type": "vcs", "url": "https://github.com/YOUR_USERNAME/laravel-breadcrumbs.git" } ], "require": { "davejamesmiller/laravel-breadcrumbs": "dev-YOUR_BRANCH" } }
将 YOUR_USERNAME
替换为您的 GitHub 用户名,将 YOUR_BRANCH
替换为分支名称(例如 develop
)。这将告诉 Composer 使用您的存储库而不是默认存储库。
运行测试应用程序
或者,在存储库中有一个测试应用程序,它通过 Docker Compose 运行(仅在 Linux 上进行了测试)
git clone git@github.com:davejamesmiller/laravel-breadcrumbs.git cd laravel-breadcrumbs scripts/serve.sh # Make changes and commit them git checkout -b YOUR_BRANCH git remote add YOUR_USERNAME git@github.com:YOUR_USERNAME/laravel-breadcrumbs.git git push -u YOUR_USERNAME YOUR_BRANCH
单元测试
要运行单元测试:
# Docker Compose (recommended) scripts/test.sh # Local PHP composer install vendor/bin/phpunit
要检查代码覆盖率:
# Docker Compose scripts/test-coverage.sh # Local PHP php -d xdebug.coverage_enable=On vendor/bin/phpunit --coverage-html test-coverage
然后打开 test-coverage/index.html
查看结果。请注意,PHPUnit中可能造成结果并不完全准确的边缘情况。
API 文档
使用 phpDocumentor 生成 API 文档
# Docker Compose scripts/phpdoc.sh # Local PHP mkdir -p api-docs/bin curl https://www.phpdoc.org/phpDocumentor.phar > api-docs/bin/phpdoc chmod +x api-docs/bin/phpdoc api-docs/bin/phpdoc
注意:由于使用了 function for(...)
,目前此文档对 BreadcrumbsManager
无效,尽管这是有效的 PHP7 代码。
其他有用的 Docker Compose 脚本
# Composer scripts/composer.sh install # Install Laravel template in laravel-template/ (for upgrading test-app/) scripts/install-laravel-template.sh # Delete all generated files scripts/clean.sh
许可
版权所有 © 2013-2018 Dave James Miller
以下任何人可以免费获得此软件及其相关文档副本(以下简称“软件”),不受任何限制地处理该软件,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件副本,并允许软件提供者进行此类处理,前提是遵守以下条件
上述版权声明和本许可声明应包含在软件的所有副本或主要部分中。
软件按“现状”提供,不提供任何形式的保证,无论是明示的还是暗示的,包括但不限于适销性、特定用途适用性和非侵权性保证。在任何情况下,作者或版权所有者不应对任何索赔、损害或其他责任负责,无论这些索赔、损害或其他责任是由于合同、侵权或其他方式引起的,无论是与软件或其使用或其他方式相关的。