/**
  * Transforms an id to an object (menu item).
  *
  * @param string $menuItemId
  *
  * @return MenuItemInterface|null
  *
  * @throws TransformationFailedException if object (menu item) is not found
  */
 public function reverseTransform($menuItemId)
 {
     if (null === $menuItemId) {
         return;
     }
     $menuItem = $this->repository->getOneMenuItemById((int) $menuItemId);
     if (null === $menuItem) {
         throw new TransformationFailedException(sprintf('Menu with id "%s" does not exist!', $menuItem));
     }
     return $menuItem;
 }
 /**
  * {@inheritdoc}
  */
 public function move(MenuItemInterface $sourceItem, MenuItemInterface $parent, int $position = 0)
 {
     if (0 === $position) {
         $this->ensurePositionIsValid($sourceItem, $position);
         $this->menuItemRepository->persistAsFirstChildOf($sourceItem, $parent);
     } else {
         $afterItemPosition = $position;
         // when moving item from last to middle position
         if ($afterItemPosition < $sourceItem->getPosition()) {
             $afterItemPosition -= 1;
         }
         $this->ensurePositionIsValid($sourceItem, $afterItemPosition);
         // find menu item after which source item should be placed
         $afterItem = $this->menuItemRepository->findChildByParentAndPosition($parent, $afterItemPosition);
         if (null === $afterItem) {
             throw new HttpException(400, sprintf('You can not insert menu item at position %d. Position is not valid.', $position));
         }
         $this->menuItemRepository->persistAsNextSiblingOf($sourceItem, $afterItem);
     }
     $sourceItem->setPosition($position);
     $this->objectManager->flush();
 }
 public function it_throws_exception_if_item_after_moved_item_should_be_placed_does_not_exist(MenuItemInterface $sourceItem, MenuItemInterface $parentItem, MenuItemInterface $afterItem, MenuItemRepositoryInterface $menuItemRepository, ObjectManager $objectManager)
 {
     $sourceItem->getPosition()->willReturn(1);
     $menuItemRepository->findChildByParentAndPosition($parentItem, 2)->willReturn(null);
     $menuItemRepository->persistAsNextSiblingOf($sourceItem, $afterItem)->shouldNotBeCalled();
     $sourceItem->getPosition()->shouldBeCalled();
     $sourceItem->setPosition(2)->shouldNotBeCalled();
     $objectManager->flush()->shouldNotBeCalled();
     $this->shouldThrow(HttpException::class)->duringMove($sourceItem, $parentItem, 2);
 }
 /**
  * {@inheritdoc}
  */
 public function has($name, array $options = [])
 {
     $menuItem = $this->repository->getOneMenuItemByName($name);
     return $menuItem instanceof MenuItemInterface;
 }