Open a command console, enter your project directory and execute:
$ composer require unlooped/menu-bundleOpen a command console, enter your project directory and execute the following command to download the latest stable version of this bundle:
$ composer require unlooped/menu-bundleThis command requires you to have Composer installed globally, as explained in the installation chapter of the Composer documentation.
Then, enable the bundle by adding it to the list of registered bundles
in the app/AppKernel.php file of your project:
// app/AppKernel.php
// ...
class AppKernel extends Kernel
{
public function registerBundles()
{
$bundles = [
// ...
new Unlooped\MenuBundle\UnloopedMenuBundle(),
];
// ...
}
// ...
}Currently only works with create#NAME#Menu().
<?php
namespace App\Service;
use Doctrine\Common\Annotations\AnnotationException;
use ReflectionException;
use Unlooped\MenuBundle\Exception\NameForMenuAlreadyExistsException;
use Unlooped\MenuBundle\Exception\ShowAndHideAnnotationSetException;
use Unlooped\MenuBundle\Helper\MenuHelper;
use Unlooped\MenuBundle\Service\AbstractMenuBuilderService;
class MenuBuilderService extends AbstractMenuBuilderService
{
/**
* @throws NameForMenuAlreadyExistsException
* @throws AnnotationException
* @throws ReflectionException
* @throws ShowAndHideAnnotationSetException
*/
public function createMainMenu(): MenuHelper
{
return $this->createMenuHelper()
->addMenu('Link A', ['route' => 'route_name_a'])
->addMenu('Link B', ['route' => 'route_name_b'])
->addMenu('Link C', ['route' => 'route_name_c'])
;
}
}[
'label' => null, // null or string
'attr' => [], // array
'route' => '', // string
'routeOptions' => [], // see route options
'routeAsAbsolute' => true, // bool
'url' => '', // string
'other' => [], // array
'visible' => true, // bool
]public function createMainMenu(): MenuHelper
{
return $this->createMenuHelper()
->addSubMenu('Category 1', [options])
->addMenu('Link 1 A', ['route' => 'route_name_c1_a'])
->addMenu('Link 1 B', ['route' => 'route_name_c1_b'])
->addMenu('Link 1 C', ['route' => 'route_name_c1_c'])
->end()
->addSubMenu('Category 2', [options])
->addMenu('Link 2 A', ['route' => 'route_name_c2_a'])
->addMenu('Link 2 B', ['route' => 'route_name_c2_b'])
->addMenu('Link 2 C', ['route' => 'route_name_c2_c'])
->addSubMenu('Category 2 A', ['route' => 'route_name_cat2a'])
->addMenu('Link 2A A', ['route' => 'route_name_c2_a'])
->addMenu('Link 2A B', ['route' => 'route_name_c2_b'])
->addMenu('Link 2A C', ['route' => 'route_name_c2_c'])
->end()
->end()
;
}{{ render_menu('main') }}{{ render_menu('main', '@UnloopedMenu/bootstrap_4_sidebar_menu.html.twig', {'attr': {'class': 'collapse', 'id': 'docs'}}) }}{{ render_breadcrumbs('main') }}Use either the HideInMenu or ShowInMenu annotation on the route method in your controller:
Hides the link for everybody:
/**
* @Route("/home", name="home")
*
* @HideInMenu()
*/
public function dashboard(): Response
{
return $this->render('dashboard/index.html.twig', [
'controller_name' => 'DashboardController',
]);
}Hides Menu only for users with role ROLE_GUEST OR ROLE_USER
/**
* @Route("/home", name="home")
*
* @HideInMenu(forRoles={"ROLE_GUEST", "ROLE_USER"})
*/
public function dashboard(): Response
{
return $this->render('dashboard/index.html.twig', [
'controller_name' => 'DashboardController',
]);
}Show Menu only for users with role ROLE_ADMIN OR ROLE_USER
/**
* @Route("/home", name="home")
*
* @ShowInMenu(forRoles={"ROLE_ADMIN", "ROLE_USER"})
*/
public function dashboard(): Response
{
return $this->render('dashboard/index.html.twig', [
'controller_name' => 'DashboardController',
]);
}