191 lines
6.8 KiB
ReStructuredText
191 lines
6.8 KiB
ReStructuredText
################################################################################
|
|
Route-Bound Breadcrumbs
|
|
################################################################################
|
|
|
|
In normal usage you must call ``Breadcrumbs::render($name, $params...)`` to render the breadcrumbs on every page. If you prefer, you can name your breadcrumbs the same as your routes and avoid this duplication.
|
|
|
|
.. only:: html
|
|
|
|
.. contents::
|
|
:local:
|
|
|
|
|
|
================================================================================
|
|
Setup
|
|
================================================================================
|
|
|
|
----------------------------------------
|
|
Name your routes
|
|
----------------------------------------
|
|
|
|
Make sure each of your routes has a name (``'as'`` parameter). For example (``routes/web.php``):
|
|
|
|
.. code-block:: php
|
|
|
|
// Home
|
|
Route::get('/', ['as' => 'home', 'uses' => 'HomeController@index']);
|
|
|
|
// Home > [Page]
|
|
Route::get('/page/{id}', ['as' => 'page', 'uses' => 'PageController@show']);
|
|
|
|
For more details see `Named Routes <https://www.laravel.com/docs/5.3/routing#named-routes>`_ in the Laravel documentation.
|
|
|
|
|
|
----------------------------------------
|
|
Name your breadcrumbs to match
|
|
----------------------------------------
|
|
|
|
For each route, create a breadcrumb with the same name. For example (``routes/breadcrumbs.php``):
|
|
|
|
.. code-block:: php
|
|
|
|
// Home
|
|
Breadcrumbs::register('home', function($breadcrumbs) {
|
|
$breadcrumbs->push('Home', route('home'));
|
|
});
|
|
|
|
// Home > [Page]
|
|
Breadcrumbs::register('page', function($breadcrumbs, $id)
|
|
{
|
|
$page = Page::findOrFail($id);
|
|
$breadcrumbs->parent('home');
|
|
$breadcrumbs->push($page->title, route('page', $page->id));
|
|
});
|
|
|
|
|
|
----------------------------------------
|
|
Output breadcrumbs in your layout
|
|
----------------------------------------
|
|
|
|
Call ``Breadcrumbs::render()`` with no parameters in your layout file (e.g. ``resources/views/app.blade.php``):
|
|
|
|
.. code-block:: html+php
|
|
|
|
{!! Breadcrumbs::render() !!}
|
|
|
|
This will automatically output breadcrumbs corresponding to the current route.
|
|
|
|
It will throw an exception if the breadcrumb doesn't exist, to remind you to create one. To prevent this behaviour, change it to:
|
|
|
|
.. code-block:: html+php
|
|
|
|
{!! Breadcrumbs::renderIfExists() !!}
|
|
|
|
|
|
================================================================================
|
|
Route model binding
|
|
================================================================================
|
|
|
|
Laravel Breadcrumbs uses the same model binding as the controller. For example:
|
|
|
|
.. code-block:: php
|
|
|
|
// routes/web.php
|
|
Route::model('page', 'Page');
|
|
Route::get('/page/{page}', ['uses' => 'PageController@show', 'as' => 'page']);
|
|
|
|
.. code-block:: php
|
|
|
|
// app/Http/Controllers/PageController.php
|
|
class PageController extends Controller
|
|
{
|
|
public function show($page)
|
|
{
|
|
return view('page/show', ['page' => $page]);
|
|
}
|
|
}
|
|
|
|
.. code-block:: php
|
|
|
|
// routes/breadcrumbs.php
|
|
Breadcrumbs::register('page', function($breadcrumbs, $page)
|
|
{
|
|
$breadcrumbs->parent('home');
|
|
$breadcrumbs->push($page->title, route('page', $page->id));
|
|
});
|
|
|
|
This makes your code less verbose and more efficient by only loading the page from the database once.
|
|
|
|
For more details see `Route Model Binding <https://www.laravel.com/docs/5.3/routing#route-model-binding>`_ in the Laravel documentation.
|
|
|
|
|
|
================================================================================
|
|
Resourceful controllers
|
|
================================================================================
|
|
|
|
Laravel automatically creates route names for resourceful controllers, e.g. ``photo.index``, which you can use when defining your breadcrumbs. For example:
|
|
|
|
.. code-block:: php
|
|
|
|
// routes/web.php
|
|
Route::resource('photo', 'PhotoController');
|
|
|
|
.. code-block:: bash
|
|
|
|
$ 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 | |
|
|
+--------+----------+--------------------+---------------+-------------------------+------------+
|
|
|
|
.. code-block:: php
|
|
|
|
// routes/breadcrumbs.php
|
|
|
|
// Photos
|
|
Breadcrumbs::register('photo.index', function($breadcrumbs)
|
|
{
|
|
$breadcrumbs->parent('home');
|
|
$breadcrumbs->push('Photos', route('photo.index'));
|
|
});
|
|
|
|
// Photos > Upload Photo
|
|
Breadcrumbs::register('photo.create', function($breadcrumbs)
|
|
{
|
|
$breadcrumbs->parent('photo.index');
|
|
$breadcrumbs->push('Upload Photo', route('photo.create'));
|
|
});
|
|
|
|
// Photos > [Photo Name]
|
|
Breadcrumbs::register('photo.show', function($breadcrumbs, $photo)
|
|
{
|
|
$breadcrumbs->parent('photo.index');
|
|
$breadcrumbs->push($photo->title, route('photo.show', $photo->id));
|
|
});
|
|
|
|
// Photos > [Photo Name] > Edit Photo
|
|
Breadcrumbs::register('photo.edit', function($breadcrumbs, $photo)
|
|
{
|
|
$breadcrumbs->parent('photo.show', $photo);
|
|
$breadcrumbs->push('Edit Photo', route('photo.edit', $photo->id));
|
|
});
|
|
|
|
For more details see `Resource Controllers <https://www.laravel.com/docs/5.3/controllers#resource-controllers>`_ in the Laravel documentation.
|
|
|
|
|
|
================================================================================
|
|
Implicit controllers
|
|
================================================================================
|
|
|
|
To use implicit controllers, you must specify names for each route. For example:
|
|
|
|
.. code-block:: php
|
|
|
|
// routes/web.php
|
|
Route::controller('auth', 'Auth\AuthController', [
|
|
'getRegister' => 'auth.register',
|
|
'getLogin' => 'auth.login',
|
|
]);
|
|
|
|
(You don't need to provide route names for actions that redirect and never display a view - e.g. most POST views.)
|
|
|
|
For more details see `Implicit Controllers <https://www.laravel.com/docs/5.1/controllers#implicit-controllers>`_ in the Laravel documentation.
|