3

我一直在使用 fos 用户包,其中每个用户都被分配到一个组,并且每个组都根据 fos 用户包提供了一个特定的角色,一切正常。

现在要制作菜单系统,我正在尝试使用 Knp 菜单包。现在要制作菜单结构,我想将每个组的角色传递给菜单系统(动态)。这样,改变特定组的角色可以让菜单系统动态改变.

我已经按照文档配置了菜单包

knp 菜单包文档

在这里,我在命名空间 Admin\Bundle\HomeBundle\Menu 中添加了一个名为 menu builder 的类;现在我需要调用当前登录用户的组角色并将它们动态添加到菜单中,我还需要将其中一些角色添加到同一主菜单中的子菜单中。如果我走错了路(如果有的话),请改进我,并处理我如何使用 Knp 菜单包作为服务动态地将组的角色包含到菜单中。

提前致谢。

4

2 回答 2

3

我在 Symfony 3 中找到了另一个解决方案。您可以security.authorization_checker从容器中获取并在菜单中使用它

namespace AppBundle\Menu;


use Knp\Menu\FactoryInterface;
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
use Symfony\Component\DependencyInjection\ContainerAwareTrait;

class Builder implements ContainerAwareInterface
{
   use ContainerAwareTrait;
   public function topHeaderMenu(FactoryInterface $factory, array $options)
   {
      $checker = $this->container->get('security.authorization_checker');
      $menu = $factory->createItem('root');
      $menu->setChildrenAttribute('class','links-top list-inline');
      if ($checker->isGranted('ROLE_ADMIN')) {
        $menu->addChild('admin panel', array('route' => 'admin'));
      }
      if ($checker->isGranted('ROLE_USER')) {
        $menu->addChild('account', array('route' => 'login'));
        $menu->addChild('logout', array('route' => 'logout'));
      } else {
        $menu->addChild('registration', array('route' => 'registration'));
        $menu->addChild('login', array('route' => 'login'));
      }

      return $menu;
  }
}
于 2016-07-21T03:59:53.897 回答
1

在 Symfony3 中,对我来说最好和最简单的解决方案是在 MenuBuilder.php 中:

use Knp\Menu\FactoryInterface;
use Symfony\Component\DependencyInjection\ContainerAwareTrait;
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;

class MenuBuilder implements ContainerAwareInterface
{
use ContainerAwareTrait;

public function __construct(FactoryInterface $factory, AuthorizationCheckerInterface $authorizationChecker)
{
    $this->factory = $factory;
    $this->checker = $authorizationChecker;
}

public function mainMenu(array $options)
{
    $menu = $this->factory->createItem('root');
    $menu->addChild('Home', array('route' => 'homepage'));
    $menu->addChild('Blog', array('route' => 'blog_homepage'));
    $menu['Blog']->addChild('About', array('route' => 'blog_about'));
    $menu['Blog']->addChild('Contact Us', array('route' => 'blog_contact'));

    if($this->checker->isGranted('ROLE_ADMIN')) {

        $menu->addChild('Admin', array('route' => 'sonata_admin_dashboard'));
    }
    $menu->addChild('User', array('route' => 'fos_user_profile_show'));
    $menu['User']->addChild('Register', array('route' => 'fos_user_registration_register'));
    $menu['User']->addChild('Change password', array('route' => 'fos_user_change_password'));
    $menu['User']->addChild('Log Out', array('route' => 'fos_user_security_logout'));
    // ... add more children

    return $menu;
}
}

Donf 忘记将“@security.authorization_checker”添加到服务中的参数

于 2016-07-08T09:53:35.823 回答