benoitmariaux/bcm-breadcrumbbundle
Installation:
composer require benoitmariaux/bcm-breadcrumbbundle:dev-master
Enable the bundle in config/bundles.php (Symfony 4+) or AppKernel.php (Symfony 3):
BCM\BreadcrumbBundle\BCMBreadcrumbBundle::class => ['all' => true],
Configure Routes:
Add label (required) and parent (optional) to route defaults in config/routes.yaml:
homepage:
path: /
defaults:
_controller: App\Controller\DefaultController::home
label: "Home"
articles:
path: /articles
defaults:
_controller: App\Controller\ArticleController::list
label: "Articles"
parent: homepage
First Render: Inject the manager in a controller and render breadcrumbs:
use BCM\BreadcrumbBundle\Manager\BreadcrumbManager;
public function showArticle(Article $article, BreadcrumbManager $breadcrumbManager)
{
$breadcrumb = $breadcrumbManager->render([
'article_title' => $article->getTitle(),
]);
return $this->render('article/show.html.twig', [
'breadcrumb' => $breadcrumb,
]);
}
Display in Twig: Use the provided Twig extension in your template:
{{ breadcrumb() }}
Route Configuration:
parent route references.{article_title}) for runtime values.Controller Integration:
render() (e.g., article_title).Twig Integration:
{{ breadcrumb() }} for default rendering.breadcrumb_link):
{% for item in breadcrumb() %}
{{ item.link }} {{ item.label }}
{% endfor %}
Dynamic Parent Routes:
Override parent routes in render() for context-specific hierarchies:
$breadcrumbManager->render([], 'custom_parent_route');
Multi-Language Support: Use route parameters for locale-aware labels:
label: "{_locale}_homepage"
Pass _locale in render():
$breadcrumbManager->render(['_locale' => $request->getLocale()]);
API-Driven Breadcrumbs:
Fetch breadcrumb data via a dedicated endpoint (e.g., /api/breadcrumb) and cache responses.
config/packages/bcm_breadcrumb.yaml for environment-specific configs.KernelEvents::CONTROLLER).BreadcrumbManager in PHPUnit:
$this->breadcrumbManager->expects($this->once())
->method('render')
->with(['title' => 'Test'])
->willReturn($mockedBreadcrumb);
Route Caching:
php bin/console cache:clear) after adding/editing routes./articles/{id}) must include label in defaults, not requirements.Label Placeholders:
{missing_param}) render as literal text. Validate inputs:
$breadcrumbManager->render(['article_title' => $article->getTitle() ?? 'Untitled']);
Circular References:
parent: self or cyclic dependencies (e.g., A -> B -> A). The bundle throws a RuntimeException.Twig Autoescape:
|raw in Twig:
{{ breadcrumb()[0].label|raw }}
Dumping Routes: Check route configurations with:
php bin/console debug:router | grep "label\|parent"
Manager Methods: Inspect available methods:
$methods = get_class_methods($breadcrumbManager);
// ['render', 'getCurrentRoute', 'getParentRoute', ...]
Log Levels: Enable debug mode to log breadcrumb generation:
# config/packages/dev/bcm_breadcrumb.yaml
bcm_breadcrumb:
debug: true
Custom Renderers:
Extend BCM\BreadcrumbBundle\Renderer\RendererInterface for non-Twig outputs (e.g., JSON):
class JsonRenderer implements RendererInterface {
public function render(array $items) {
return json_encode($items);
}
}
Register in services.yaml:
services:
App\Renderer\JsonRenderer:
tags: [bcm_breadcrumb.renderer]
Event Dispatching:
Listen for bcm_breadcrumb.build events to modify items:
use BCM\BreadcrumbBundle\Event\BreadcrumbEvent;
$eventDispatcher->addListener(BreadcrumbEvent::BUILD, function (BreadcrumbEvent $event) {
$event->addItem('Custom Item', '/custom');
});
Configuration Overrides:
Override default Twig paths in config/packages/bcm_breadcrumb.yaml:
bcm_breadcrumb:
twig:
template: 'custom_breadcrumb.html.twig'
extension_class: 'App\Twig\Extension\CustomBreadcrumbExtension'
cache:warmup in deployment scripts to pre-compile routes.{% cache 'breadcrumb_' app.request.get('_route') %}
{{ breadcrumb() }}
{% endcache %}
How can I help you explore Laravel packages today?