Very lightweight but powerful breadcrumbs builder for symfony
composer require zemd/symfony-menu
This component build breadcrumb path leveraging standard symfony router. If you want to skip or modify some part of the path feel free to use @Breadcrumbs annotation.
For instance we have next controller:
class MyController {
/**
* This route should be skipped from menu chain
*
* @Breadcrumbs(skip=true)
*/
public function myActionIwantToSkip() {}
/**
* This route should be in the root of menu tree
*
* @Route("/dashboard", name="dashboard")
* @Breadcrumbs(root=true)
*/
public function dashboardAction() {}
/**
* This route should be added automatically into menu chain
*
* @Route("/dashboard/graphs")
*/
public function viewMoreGraphsAction() {}
}
Let's now share breadcrumbs into the view by using twig globals as example:
class BreadcrumbsGlobalExtension extends \Twig_Extension implements Twig_Extension_GlobalsInterface
{
const NAME = 'zemd_breadcrumbs_extension';
/** @var BreadCrumbsManager */
protected $breadcrumbsManager;
public function __construct(BreadCrumbsManager $breadcrumbsManager) {
$this->breadcrumbsManager = $breadcrumbsManager;
}
/**
* Returns the name of the extension.
*
* @return string The extension name
*/
public function getName() {
return self::NAME;
}
public function getGlobals() {
return [
'zemd_breadcrumbs' => $this->breadcrumbsManager->getBreadcrumbs()
];
}
}
services:
zemd.breadcrumbs_manager:
class: Zemd\Component\Menu\BreadCrumbsManager
arguments: ["@router", "@annotation_reader", "@request_stack"]
calls:
- [setContainer, ["@service_container"]]
zemd.breadcrumbs.twig_extension:
class: Path\To\Your\BreadcrumbsGlobalExtension
public: false
arguments: ["@zemd.breadcrumbs_manager"]
tags:
- { name: twig.extension }
zemd.router_checker.twig_extension:
class: Zemd\Component\Menu\Twig\Extension\RouteChecker
public: false
arguments: ["@request_stack", "@zemd.breadcrumbs_manager"]
tags:
- { name: twig.extension }
Now we can show our menu in the header and style or translate menu items as we want:
<nav id="Nav-bread" class="navbar navbar-breadcrumbs clearfix" role="navigation">
{% for node in zemd_breadcrumbs %}
<div class="navbar__item{% if (is_route_active(node.routeName)) %} active{% endif %}">
<a href="{{ path(node.routeName, node.pathParams) }}">
<span>{{ node.routeName|trans({}, "breadcrumbs") }}</span>
</a>
</div>
{% endfor %}
</nav>
// TODO: Example for generator
Symfony Menu is released under the MIT license.