Фильтрация пунктов меню по роли пользователя

У меня есть несколько пользовательских ролей на моем сайте. Некоторые контроллеры имеют ограничения доступа в зависимости от роли пользователя.
У меня также есть меню (на основе KnpMenuBundle), и мне нужно включить только те элементы, которые доступны для вошедшего в систему пользователя.

Сейчас я решил отфильтровать элементы следующим образом:
1. Добавьте ко всем защищенным маршрутам новую опцию rolesто есть roles: [ROLE_ADMIN, ROLE_MANAGER]
2. При построении меню сопоставьте текущие роли пользователя с параметром.

Я пытался выяснить, есть ли такая функциональность в Symfony (я имею в виду ограничение роли, определенное в настройках маршрута), но мне не удалось найти что-то подобное.

Итак, у меня есть следующие вопросы:
1. Как отфильтровать пункты меню по ролям пользователей? (Может быть, уже есть функциональность для этого?)
Если ответ на предыдущий вопрос «нет», то:
2. как я могу построить такую ​​фильтрацию самостоятельно? Как я уже упоминал, я решил добавить новую опцию в этом случае, так как сделать это наилучшим образом?

3

Решение

Может быть, вы могли бы использовать мой KnpMenu Builder в качестве примера?

namespace AppBundle\Menu;

use Knp\Menu\FactoryInterface;
use Symfony\Component\DependencyInjection\ContainerAware;

class Builder extends ContainerAware
{
public function mainMenu(FactoryInterface $factory, array $options)
{
$sc = $this->container->get('security.context');

$menu = $factory->createItem('root');
$menu->setChildrenAttribute('class', 'nav navbar-nav');

$menu->addChild('About us', array('route' => 'about'));
$menu->addChild('Contact', array('route' => 'contact'));

/*
* before we use isGranted() we have to check if the security is available, otherwise we will receive an exception on the custom error pages. See also
* http://symfony.com/doc/current/cookbook/controller/error_pages.html#avoiding-exceptions-when-using-security-functions-in-error-templates
*/
if($sc->getToken())
{
$menu->addChild('Members', array('uri' => '#'))
->setAttribute('dropdown', true);

if($sc->isGranted('IS_AUTHENTICATED_REMEMBERED'))
{
$menu['Members']->addChild('My profile', array('route' => 'fos_user_profile_show'));

if($sc->isGranted('ROLE_ADMIN'))
{
$menu['Members']->addChild('Dashboard', array('route' => 'sonata_admin_dashboard'))
->setAttribute('divider_append', true);
}

$menu['Members']->addChild('Logout', array('route' => 'fos_user_security_logout'));
}
else
{
$menu['Members']->addChild('Login', array('route' => 'fos_user_security_login'));
$menu['Members']->addChild('Registration', array('route' => 'fos_user_registration_register'));
}
}

return $menu;
}

}
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]