codeconsortium/ccdn-component-crumb-trail-bundle
Installation
Add the bundle to your composer.json:
composer require codeconsortium/ccdn-component-crumb-trail-bundle
Register the bundle in config/bundles.php:
return [
// ...
CodeConsortium\CCDNComponentCrumbTrailBundle\CodeConsortiumCCDNComponentCrumbTrailBundle::class => ['all' => true],
];
Basic Usage
Inject the crumb_trail service into your controller:
use Symfony\Component\HttpKernel\Bundle\Bundle;
use CodeConsortium\CCDNComponent\CrumbTrail\CrumbTrail;
class DefaultController extends Controller
{
public function indexAction(CrumbTrail $crumbTrail)
{
$crumbTrail->addCrumb('Home', 'homepage');
$crumbTrail->addCrumb('Products', 'products');
$crumbTrail->addCrumb('Current Page', 'current_page');
return $this->render('default/index.html.twig', [
'crumbs' => $crumbTrail->getCrumbs()
]);
}
}
Twig Integration In your Twig template, render the crumbs:
{% for crumb in crumbs %}
{% if loop.first %}
<span>{{ crumb.label }}</span>
{% else %}
<a href="{{ path(crumb.route) }}">{{ crumb.label }}</a>
{% if not loop.last %}<span class="divider">/</span>{% endif %}
{% endif %}
{% endfor %}
Leverage the fluent interface for dynamic crumb building:
$crumbTrail
->addCrumb('Home', 'homepage')
->addCrumb('Category', 'category', ['id' => 123])
->addCrumb('Product', 'product', ['id' => 456], ['class' => 'active']);
Use dependency injection for reusable crumb logic:
// services.yaml
services:
App\Service\CrumbBuilder:
arguments:
$crumbTrail: '@crumb_trail'
calls:
- [buildAdminCrumbs, []]
- [buildUserCrumbs, []]
// CrumbBuilder.php
class CrumbBuilder
{
public function __construct(private CrumbTrail $crumbTrail) {}
public function buildAdminCrumbs(): self
{
$this->crumbTrail->addCrumb('Admin', 'admin_dashboard');
return $this;
}
}
Generate routes dynamically based on context:
$crumbTrail->addCrumb(
'User Profile',
'user_profile',
['username' => $user->username],
['icon' => 'user']
);
Extend Twig for concise crumb rendering:
// src/Twig/Extension/CrumbExtension.php
class CrumbExtension extends \Twig\Extension\AbstractExtension
{
public function getFunctions()
{
return [
new \Twig\TwigFunction('render_crumbs', [$this, 'renderCrumbs']),
];
}
public function renderCrumbs(CrumbTrail $crumbTrail)
{
// Custom rendering logic
}
}
crumb_trail service is properly injected and crumbs are added before rendering.dump($crumbTrail->getCrumbs()) to inspect routes and parameters for typos.crumbs variable or the crumb_trail service.config/packages/ccdn_crumb_trail.yaml exists.Crumb class or use decorators to modify behavior:
// src/Service/CustomCrumb.php
class CustomCrumb extends \CodeConsortium\CCDNComponent\CrumbTrail\Crumb
{
public function getHtmlAttributes(): array
{
$attrs = parent::getHtmlAttributes();
$attrs['data-custom'] = 'value';
return $attrs;
}
}
CrumbInterface for specialized crumbs (e.g., dropdown menus).kernel.request to auto-populate crumbs:
// src/EventListener/CrumbListener.php
class CrumbListener
{
public function onKernelRequest(GetResponseEvent $event)
{
$request = $event->getRequest();
$crumbTrail = $event->getContainer()->get('crumb_trail');
if ($request->attributes->get('_route') === 'product_show') {
$crumbTrail->addCrumb('Product', 'product_show', ['id' => $request->attributes->get('id')]);
}
}
}
CrumbTrail service if reused across requests.How can I help you explore Laravel packages today?