diff --git a/src/Knp/Menu/MenuItem.php b/src/Knp/Menu/MenuItem.php index bbd8908f..7b561069 100644 --- a/src/Knp/Menu/MenuItem.php +++ b/src/Knp/Menu/MenuItem.php @@ -330,7 +330,7 @@ public function addChild($child, array $options = []): ItemInterface { if (!$child instanceof ItemInterface) { $child = $this->factory->createItem($child, $options); - } elseif (null !== $child->getParent()) { + } elseif (null !== $child->getParent() && $this !== $child->getParent()) { throw new \InvalidArgumentException('Cannot add menu item as child, it already belongs to another menu (e.g. has a parent).'); } @@ -423,7 +423,8 @@ public function getChildren(): array public function setChildren(array $children): ItemInterface { - $this->children = $children; + $this->children = []; + array_map([$this, 'addChild'], $children); return $this; } diff --git a/tests/Knp/Menu/Tests/MenuItemGetterSetterTest.php b/tests/Knp/Menu/Tests/MenuItemGetterSetterTest.php index c59c9845..0a5a9889 100644 --- a/tests/Knp/Menu/Tests/MenuItemGetterSetterTest.php +++ b/tests/Knp/Menu/Tests/MenuItemGetterSetterTest.php @@ -172,7 +172,7 @@ public function testChildren(): void $menu = $this->createMenu(); $child = $this->createMenu('child_menu'); $menu->setChildren([$child]); - $this->assertEquals([$child], $menu->getChildren()); + $this->assertEquals(['child_menu' => $child], $menu->getChildren()); } public function testSetExistingNameThrowsAnException(): void diff --git a/tests/Knp/Menu/Tests/MenuTestCase.php b/tests/Knp/Menu/Tests/MenuTestCase.php index 1ce52c52..91d3f81e 100644 --- a/tests/Knp/Menu/Tests/MenuTestCase.php +++ b/tests/Knp/Menu/Tests/MenuTestCase.php @@ -63,7 +63,8 @@ protected function setUp(): void $this->pt2 = $this->menu->addChild('Parent 2'); $this->ch4 = $this->pt2->addChild('Child 4'); - $this->gc1 = $this->ch4->addChild('Grandchild 1'); + $this->gc1 = new MenuItem('Grandchild 1', $factory); + $this->ch4->setChildren([$this->gc1]); } protected function tearDown(): void