/**
  * @param ItemInterface $menu
  * @param array         $data
  * @param array         $itemList
  * @param array         $options
  *
  * @return \Knp\Menu\ItemInterface
  */
 private function createFromArray(ItemInterface $menu, array $data, array &$itemList, array $options = array())
 {
     $isAllowed = false;
     foreach ($data as $itemCode => $itemData) {
         if (!empty($itemList[$itemCode])) {
             $itemOptions = $itemList[$itemCode];
             if (empty($itemOptions['name'])) {
                 $itemOptions['name'] = $itemCode;
             }
             if (empty($itemOptions['route']) && empty($itemOptions['uri'])) {
                 $itemOptions['route'] = $itemCode;
             }
             if (!empty($itemData['position'])) {
                 $itemOptions['extras']['position'] = $itemData['position'];
             }
             $this->moveToExtras($itemOptions, 'translateDomain');
             $this->moveToExtras($itemOptions, 'translateParameters');
             $newMenuItem = $menu->addChild($itemOptions['name'], array_merge($itemOptions, $options));
             if (!empty($itemData['children'])) {
                 $this->createFromArray($newMenuItem, $itemData['children'], $itemList, $options);
             }
             $isAllowed = $isAllowed || $newMenuItem->getExtra('isAllowed');
         }
     }
     $menu->setExtra('isAllowed', $isAllowed);
     if ($menu->getExtra('hideIfEmpty') && $menu->hasChildren()) {
         $willDisplaySomeChildren = false;
         foreach ($menu->getChildren() as $child) {
             if ($child->isDisplayed() && $child->getExtra('isAllowed')) {
                 $willDisplaySomeChildren = true;
                 break;
             }
         }
         if (!$willDisplaySomeChildren) {
             $menu->setDisplay(false);
         }
     }
 }
 /**
  * Set uri, display context to menu item
  *
  * @param  MenuItemInterface $item
  * @param  array             $routeParameters
  * @param  array             $options
  *
  * @return MenuFactoryInterface
  */
 protected function setContext(MenuItemInterface $item, array $routeParameters = array(), array $options = array())
 {
     $display = true;
     $rootItem = !$item->getName();
     $token = $this->security->getToken();
     if ($token) {
         if ($options['roles'] && !$this->security->isGranted($options['roles'])) {
             $display = false;
         }
         if ($display) {
             foreach ((array) $item->getExtra('oids') as $oidItem) {
                 if (!$this->security->isGranted($oidItem['permissions'], $oidItem['oid'])) {
                     $display = false;
                     break;
                 }
             }
         }
     }
     if ($options['route'] && !$rootItem) {
         $acceptedRouteParameters = array_intersect_key($routeParameters, $options['routeAcceptedParameters']);
         if ($options['routeRequiredParameters'] === $options['routeAcceptedParameters']) {
             $uri = $this->router->generate($options['route'], $acceptedRouteParameters, $options['routeAbsolute']);
             $item->setUri($uri);
         } else {
             $display = false;
         }
     }
     if (!$display) {
         if ($options['showNonAuthorized'] && !$token) {
             $display = true;
         }
         if ($options['showAsText']) {
             $display = true;
             $item->setUri(null);
         }
     }
     if (!$display) {
         $item->setDisplay(false);
     }
     return $this;
 }