This bundle can be used to build dynamic menus based on granted permissions.
class MainMenuTreeBuilder implements MenuTreeBuilderInterface
{
public function buildTree(Node $root)
{
$root
->child('social_media')
->setAttr('id', 'main_menu_social_media')
->setRequiredPermissions(['ROLE_SOCIAL_MENU'])
->child('stream')
->setRoute('social_media_stream')
->setRequiredPermissions(['ROLE_SOCIAL_STREAM'])
->setAdditionalActiveRequestMatcher(static function (Request $request): bool {
// additionally will mark node as active if the request path starts with '/foo_bar'
return str_starts_with($request->getPathInfo(), '/foo_bar');
})
->end()
->child('update_status')
->setRoute('social_media_update_status')
->setRequiredPermissions(['ROLE_SOCIAL_UPDATE_STATUS'])
->end()
->ifTrue($someCondition) // only add child node(s) inside if the condition is true
->child('statistics')
->setRoute('social_media_statistics')
->setRequiredPermissions([new Expression("has_role('ROLE_USER')")])
->end()
->endIf()
->end()
;
}
}
dama_menu:
menues:
my_main_menu:
tree_builder: Your\Namespace\MainMenuTreeBuilder #service ID OR FQCN and no constructor args
twig_template: YourNamespace:my_main_menu.html.twig #optional
{{ dama_menu_render('my_main_menu', {'collapse':true, 'nested':false}) }}