Laravel Breadcrumbs

repository·main·Indexed 21 days ago

https://github.com/diglactic/laravel-breadcrumbs

A package for defining and managing breadcrumb navigation in Laravel applications. It supports static, parent-linked, and dynamic breadcrumbs with built-in views for Bootstrap 4/5, Tailwind, Bulma, Foundation 6, Materialize, UIKit, and JSON-LD. Features include route-bound breadcrumbs, route model binding, and custom data injection via the Breadcrumbs facade.

Tokens
3.9K
Snippets
14
Records
18
Agent score
65%

What's inside laravel-breadcrumbs

  1. Use Route-Bound Breadcrumbs

    main

    You can avoid calling Breadcrumbs::render('name', $params) on every page by naming your breadcrumbs to match your Laravel route names. When you call Breadcrumbs::render() with no arguments, it automatically resolves the breadcrumb for the current route.

    Implementation Steps:

    1. Name your routes in routes/web.php (e.g., Route::name('post')->get(...)).
    2. Define breadcrumbs with matching names in routes/breadcrumbs.php (e.g., Breadcrumbs::for('post', ...)).
    3. Render in your layout using {{ Breadcrumbs::render() }}.

    Handling Exceptions

    If a route doesn't have a corresponding breadcrumb, an InvalidBreadcrumbException is thrown. You can disable this in config/breadcrumbs.php:

    • 'missing-route-bound-breadcrumb-exception' => false
    • 'unnamed-route-exception' => false (to prevent errors when a route has no name).

    Route Model Binding

    Breadcrumbs supports Laravel's route model binding. If your route is post/{post}, you can inject the Post model directly into the breadcrumb closure, ensuring the database is only queried once.

    {{-- resources/views/app.blade.php --}}
    
    {{ Breadcrumbs::render() }}
  2. Upgrade to 7.x from 6.x

    main

    Version 7.x includes several housekeeping breaking changes:

    • Removal of Breadcrumbs::register: This method, which was deprecated since 5.0.0, has been removed.
    • Template Changes: The default breadcrumbs template has changed to Bootstrap 5. Legacy Bootstrap 2 and 3 templates have been removed.
    • Alias Removal: Legacy aliases for DaveJamesMiller\Breadcrumbs have been removed.
    • Bootstrap 4 Update: The Bootstrap 4 template was updated to meet specifications.
  3. Migrate from DaveJamesMiller/laravel-breadcrumbs to diglactic/laravel-breadcrumbs

    main

    To migrate from the original davejamesmiller/laravel-breadcrumbs package to this repository (requires at least Laravel 6), follow these steps:

    1. Swap the libraries via Composer:
    composer remove davejamesmiller/laravel-breadcrumbs
    composer require diglactic/laravel-breadcrumbs
    1. Update your code references. While most classes are backwards-compatible, you should update the following namespaces to avoid future breakage:
    Original Class (davejamesmiller)New Class (diglactic)
    DaveJamesMiller\Breadcrumbs\BreadcrumbsManagerDiglactic\Breadcrumbs\Manager
    DaveJamesMiller\Breadcrumbs\BreadcrumbsGeneratorDiglactic\Breadcrumbs\Generator
    DaveJamesMiller\Breadcrumbs\BreadcrumbsServiceProviderDiglactic\Breadcrumbs\ServiceProvider
    DaveJamesMiller\Breadcrumbs\Facades\BreadcrumbsDiglactic\Breadcrumbs\Breadcrumbs

    Note: Pay close attention to class name changes, such as BreadcrumbsManager becoming simply Manager.

  4. Define Breadcrumbs in routes/breadcrumbs.php

    main

    Breadcrumbs are defined using the Breadcrumbs::for() method. You typically create a file at routes/breadcrumbs.php. Each definition takes a unique name and a closure that receives a BreadcrumbTrail object (aliased as $trail).

    Inside the closure, you use $trail->push() to add a link and $trail->parent() to establish hierarchy.

    Static Pages

    Breadcrumbs::for('home', function (BreadcrumbTrail $trail) {
        $trail->push('Home', route('home'));
    });
    Breadcrumbs::for('blog', function (BreadcrumbTrail $trail) {
        $trail->parent('home');
        $trail->push('Blog', route('blog'));
    });

    You can pass models or other variables into the closure to generate dynamic breadcrumbs.

    Breadcrumbs::for('post', function (BreadcrumbTrail $trail, Post $post) {
        $trail->parent('blog');
        $trail->push($post->title, route('post', $post));
    });
    <?php // routes/breadcrumbs.php
    
    use Diglacticreadcrubs// Breadcrumbs;
    use Diglacticreadcrumbs// Generator as BreadcrumbTrail;
    
    // Home
    Breadcrumbs::for('home', function (BreadcrumbTrail $trail) {
        $trail->push('Home', route('home'));
    });
    
    // Home > Blog
    Breadcrumbs::for('blog', function (BreadcrumbTrail $trail) {
        $trail->parent('home');
        $trail->push('Blog', route('blog'));
    });
    
    // Home > Blog > [Category]
    Breadcrumbs::for('category', function (BreadcrumbTrail $trail, $category) {
        $trail->parent('blog');
        $trail->push($category->title, route('category', $category));
    });
  5. Upgrade to 8.x from 7.x

    main

    Version 8.x introduces a breaking change where request parameters injected by middleware are passed into Breadcrumbs closures.

    Action Required: If your middleware mutates request parameters, you must review your breadcrumb definitions to ensure they handle these changes correctly. If you do not mutate request parameters in middleware, you can upgrade without code changes.

  6. Configure Breadcrumb Styles and Templates

    main

    By default, the package renders Bootstrap 5 breadcrumbs. To change the default style, follow these steps:

    1. Publish the config file:
      php artisan vendor:publish --tag=breadcrumbs-config
    2. Edit config/breadcrumbs.php and update the 'view' key.

    Supported Built-in Views:

    • breadcrumbs::bootstrap5
    • breadcrumbs::bootstrap4
    • breadcrumbs::bulma
    • breadcrumbs::foundation6
    • breadcrumbs::materialize
    • breadcrumbs::tailwind
    • breadcrumbs::uikit
    • breadcrumbs::json-ld (for SEO Structured Data)

    You can also specify a path to a custom view, e.g., 'view' => 'partials.breadcrumbs'.

    To publish all built-in templates to resources/views/vendor/breadcrumbs/ for direct editing, run:

    php artisan vendor:publish --tag=breadcrumbs-views
    // config/breadcrumbs.php
    
    'view' => 'breadcrumbs::bootstrap5',
  7. Publish breadcrumbs configuration and views

    main

    You can publish the package's configuration file and view templates to your application's config/ and resources/views/ directories using the following Artisan commands:

    To publish the configuration file: php artisan vendor:publish --tag=breadcrumbs-config

    To publish the view templates: php artisan vendor:publish --tag=breadcrumbs-views

    # Publish configuration
    php artisan vendor:publish --tag=breadcrumbs-config
    
    # Publish views
    php artisan vendor:publish --tag=breadcrumbs-views
  8. Advanced Breadcrumb Customization

    main

    Custom Data in push()

    You can pass an associative array as a third parameter to $trail->push() to attach arbitrary data to a breadcrumb. This data is available in your custom templates via the $breadcrumb object.

    $trail->push('Home', '/', ['icon' => 'home.png']);

    Note: Do not use title or url as keys in this array, as they will be overwritten.

    Before and After Callbacks

    Use Breadcrumbs::after() to append breadcrumbs to the end of every trail (e.g., for pagination).

    Breadcrumbs::after(function (BreadcrumbTrail $trail) {
        $page = (int) request('page', 1);
        if ($page > 1) {
            $trail->push("Page {$page}");
        }
    });

    Getting the Current Breadcrumb

    Use Breadcrumbs::current() to retrieve the last breadcrumb in the current trail.

    <title>{{ ($breadcrumb = Breadcrumbs::current()) ? $breadcrumb->title : 'Fallback' }}</title>

    Macros

    The Manager class is macroable. You can add custom methods to the Breadcrumbs facade:

    Breadcrumbs::macro('pageTitle', function () {
        return 'Custom Title';
    });
  9. Output Breadcrumbs in Blade Views

    main

    To render breadcrumbs in your Blade templates, use the Breadcrumbs::render() method. You can pass the breadcrumb name and any required parameters.

    Basic Rendering

    {{-- Renders the 'home' breadcrumb --}}
    {{ Breadcrumbs::render('home') }}
    
    {{-- Renders the 'category' breadcrumb with a $category object --}}
    {{ Breadcrumbs::render('category', $category) }}

    Rendering Specific Views

    If you want to use a template different from the default configured in config/breadcrumbs.php, use Breadcrumbs::view():

    {{ Breadcrumbs::view('partials.breadcrumbs2', 'category', $category) }}

    Accessing Raw Data

    To get the breadcrumbs collection directly without rendering a view, use Breadcrumbs::generate():

    @foreach (Breadcrumbs::generate('post', $post) as $breadcrumb)
        {{-- Manually iterate over breadcrumb objects --}}
    @endforeach
    {{ Breadcrumbs::render('home') }}
    
    {{ Breadcrumbs::render('category', $category) }}