ZF2 Сгенерировать навигацию с помощью zfcrbac zfcUser и иерархической стратегии роли

Я начинаю с zf2, и мне приходится обрабатывать многие до многих разрешений / ролей. Использование ZfcRbac .

Поэтому я делаю сопоставление с User / Hierarchical Role (имя таблицы = роль) / разрешения

И я делаю некоторые охранники с политикой отказа.

Моя охрана, сопоставление, база данных, все в порядке.

Моя иерархическая структура выглядит так:

class HierarchicalRole implements HierarchicalRoleInterface 

И это, на данный момент то же, что и оригинал, данный Бакурой.

Мой пользовательский объект выглядит следующим образом:

 class User extends ZfcUserEntity implements IdentityInterface 

с

  /** * @var \Doctrine\Common\Collections\Collection * @ORM\ManyToMany(targetEntity="HierarchicalRole") * @ORM\JoinTable( * name="user_role_linker", * joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="idUser")}, * inverseJoinColumns={@ORM\JoinColumn(name="role_id", referencedColumnName="id")} * ) */ protected $roles; 

и роли встроены в конструктор:

 function __construct() { $this->roles = new ArrayCollection(); } 

С помощью инструментов разработки zend я вижу, что ZfcRbac\Collector\RbacCollector показывает все, что я хочу для фактического зарегистрированного пользователя (разрешение, дети, основная роль и т. Д.).

Мой вопрос: как создать динамическую навигацию, для пользователя, который может видеть только ссылки, которым предоставляется доступ? , А также проверьте связь, когда пользователь не зашел в систему и скрыл его, когда он зарегистрировался …

Я еще новичок, но, если это было возможно, было бы здорово, если бы был хорошо объяснен пример для хорошей динамической навигации с использованием этого модуля.

EDIT (может 28) Пока я всегда ищу решение, мои попытки еще не помогли мне. Вы можете найти его здесь: Spiffy navigation Все еще не работает отлично.

Я покажу вам, как ZfcRbac может работать с (ZF2) Zend / Navigation. У вас есть определение разрешений в базе данных, поэтому я пропущу этот раздел.

Определите свою навигацию, добавляя страницы и разрешения:

конфиг / global.phpPHP:

 return array( 'navigation' => array( 'default' => array( array( 'label' => 'Contracts', 'route' => 'contract', 'action' => 'list', 'permission' => 'contract.list', 'pages' => array( array( 'label' => 'New contract', 'route' => 'contract', 'action' => 'add', 'permission' => 'contract.add', ) ) ) ) ), 'service_manager' => array( 'factories' => array( 'navigation' => 'Zend\Navigation\Service\DefaultNavigationFactory', ) ) ); 

Создайте слушателя (/module/Application/src/Application/Authorization/RbacListener.php):

 <?php namespace Application\Authorization; use Zend\EventManager\EventInterface; use Zend\Navigation\Page\AbstractPage; use ZfcRbac\Service\AuthorizationServiceInterface; class RbacListener { /** * @var AuthorizationServiceInterface */ protected $authorizationService; /** * @param AuthorizationServiceInterface $authorizationService */ public function __construct(AuthorizationServiceInterface $authorizationService) { $this->authorizationService = $authorizationService; } /** * @param EventInterface $event * @return bool|void */ public function accept(EventInterface $event) { $page = $event->getParam('page'); if (!$page instanceof AbstractPage) { return; } $permission = $page->getPermission(); if (is_null($permission)) { $event->stopPropagation(); return false; } $event->stopPropagation(); return $this->authorizationService->isGranted($permission); } } 

Создайте фабрику для RbacListener (/module/Application/src/Application/Factory/RbacListenerFactory.php):

 <?php namespace Application\Factory; use Application\Authorization\RbacListener; use Zend\ServiceManager\FactoryInterface; use Zend\ServiceManager\ServiceLocatorInterface; class RbacListenerFactory implements FactoryInterface { /** * {@inheritDoc} */ public function createService(ServiceLocatorInterface $serviceLocator) { $authorizationService = $serviceLocator->get('ZfcRbac\Service\AuthorizationService'); return new RbacListener($authorizationService); } } 

Добавьте RbacListenerFactory в ServiceManager (/module/Application/config/module.config.php):

 <?php return array( 'service_manager' => array( 'factories' => array( 'Application\Authorization\RbacListener' => 'Application\Factory\RbacListenerFactory', ), ), ); 

Прикрепите событие к методу isAllowed помощника по представлению навигации Zend (и, наконец, присоедините событие к методу isAllowed помощника по просмотру Zend):

 <?php public function onBootstrap(MvcEvent $event) { $application = $event->getApplication(); $eventManager = $application->getEventManager(); $sharedEventManager = $eventManager->getSharedManager; $serviceManager = $application->getServiceManager(); $rbacListener = $serviceManager->get('Application\Authorization\RbacListener'); $sharedEventManager->attach( 'Zend\View\Helper\Navigation\AbstractHelper', 'isAllowed', array($rbacListener, 'accept') ); } 

Чтобы отобразить меню в виде или макете:

 <?php echo $this->navigation('navigation')->menu(); ?> 

Я использую этот код, и он работает очень хорошо. Он основан на: