Installation:
composer require mhujer/breadcrumbs-bundle
Enable in config/bundles.php:
WhiteOctober\BreadcrumbsBundle\WhiteOctoberBreadcrumbsBundle::class => ['all' => true],
Basic Configuration:
Create config/packages/white_october_breadcrumbs.yaml with:
white_october_breadcrumbs: ~
First Use Case:
In a controller (e.g., src/Controller/PostController.php), inject the service and add a breadcrumb:
use WhiteOctober\BreadcrumbsBundle\BreadcrumbsGenerator;
public function show(Post $post, BreadcrumbsGenerator $breadcrumbs)
{
$breadcrumbs->addRouteItem('Home', 'homepage');
$breadcrumbs->addItem('Posts', $this->generateUrl('post_index'));
$breadcrumbs->addItem('Post: ' . $post->getTitle(), $this->generateUrl('post_show', ['id' => $post->getId()]));
}
Display in Twig:
Add to your template (e.g., templates/base.html.twig):
{% block breadcrumbs %}
{% if breadcrumbs %}
<nav class="breadcrumbs" aria-label="Breadcrumbs">
<ol>
{% for breadcrumb in breadcrumbs %}
<li{{ breadcrumb.isActive ? ' class="active"' : '' }}>
{% if breadcrumb.link %}
<a href="{{ breadcrumb.link }}">{{ breadcrumb.title }}</a>
{% else %}
{{ breadcrumb.title }}
{% endif %}
</li>
{% endfor %}
</ol>
</nav>
{% endif %}
{% endblock %}
Dynamic Breadcrumbs:
Use addItem() with dynamic data (e.g., user-specific routes):
$breadcrumbs->addItem(
'User: ' . $user->getName(),
$this->generateUrl('user_profile', ['id' => $user->getId()])
);
Route-Based Breadcrumbs:
Leverage addRouteItem() for Symfony routes:
$breadcrumbs->addRouteItem('Dashboard', 'dashboard');
$breadcrumbs->addRouteItem('Projects', 'project_index');
Entity Hierarchies: Build breadcrumbs from nested entities (e.g., categories/subcategories):
$category = $post->getCategory();
$breadcrumbs->addItem('Home', $this->generateUrl('homepage'));
$breadcrumbs->addItem($category->getParent()->getName(), $this->generateUrl('category_show', ['id' => $category->getParent()->getId()]));
$breadcrumbs->addItem($category->getName(), $this->generateUrl('category_show', ['id' => $category->getId()]));
Twig Extensions:
Use the white_october_breadcrumbs Twig function for templates:
{{ white_october_breadcrumbs()|raw }}
Service Integration:
Inject BreadcrumbsGenerator into services (e.g., event listeners):
public function onKernelRequest(GetResponseEvent $event, BreadcrumbsGenerator $breadcrumbs)
{
if ($event->isMasterRequest()) {
$breadcrumbs->addRouteItem('Home', 'homepage');
}
}
$this->generateUrl() for links to ensure consistency with Symfony’s routing system.trans('messages.home')) for i18n support.php bin/console cache:clear) after adding new routes or templates.BreadcrumbsGenerator in PHPUnit tests to verify breadcrumb logic:
$breadcrumbs = $this->createMock(BreadcrumbsGenerator::class);
$breadcrumbs->expects($this->once())->method('addItem');
Deprecated Package:
whiteoctober/BreadcrumbsBundle.Route Resolution:
config/routes.yaml or annotations.php bin/console debug:router
Twig Context:
white_october_breadcrumbs Twig function requires the BreadcrumbsGenerator service to be available. If missing, check:
bundles.php.Active State Logic:
isActive property is determined by the current request’s route. If breadcrumbs appear incorrect, verify:
addRouteItem().Performance:
$breadcrumbs->addItem('Cached Item', $this->generateUrl('cached_route'), ['cache' => true]);
dump($breadcrumbs->get());
php bin/console debug:container white_october_breadcrumbs
php bin/console cache:clear --env=prod
Custom Renderers: Override the Twig template or create a custom renderer by extending the bundle’s logic:
{% macro render_breadcrumbs(breadcrumbs) %}
<nav aria-label="Custom Breadcrumbs">
<ul>
{% for item in breadcrumbs %}
<li class="{{ item.isActive ? 'active' }}">
{% if item.link %}<a href="{{ item.link }}">{{ item.title }}</a>{% else %}{{ item.title }}{% endif %}
</li>
{% endfor %}
</ul>
</nav>
{% endmacro %}
Event Listeners:
Dynamically modify breadcrumbs via events (e.g., kernel.request):
public function onKernelRequest(GetResponseEvent $event, BreadcrumbsGenerator $breadcrumbs)
{
$request = $event->getRequest();
if ($request->attributes->get('_route') === 'post_show') {
$breadcrumbs->removeLast();
$breadcrumbs->addItem('Custom Title', $request->getUri());
}
}
Configuration Overrides:
Extend the default config in config/packages/white_october_breadcrumbs.yaml:
white_october_breadcrumbs:
default_template: 'custom_breadcrumbs' # Override Twig template
home_link: '/custom-home-route' # Custom home link
Service Decorators:
Decorate BreadcrumbsGenerator to add pre/post-processing:
services:
app.breadcrumbs.decorator:
decorates: white_october_breadcrumbs
arguments: ['@app.breadcrumbs.decorator.inner']
How can I help you explore Laravel packages today?