diff --git a/src/Actions/PrepareMenuAction.php b/src/Actions/PrepareMenuAction.php
new file mode 100644
index 0000000000000000000000000000000000000000..6c819831ff2c5e757354a29e2325268c881ea3fb
--- /dev/null
+++ b/src/Actions/PrepareMenuAction.php
@@ -0,0 +1,35 @@
+<?php
+
+namespace App\Actions;
+
+class PrepareMenuAction
+{
+    /**
+     * Группирует подразедлы в верхние разделы меню
+     * Дочерние элементы помещает в массив родителя с ключом submenu
+     * Значение под ключом depth определяет уровень раздела
+     * Массив $aMenu всегда должен начинается с элемента depth = 0,
+     * все последующие элементы с depth = 1 являются его дочерними элементами
+     *
+     * @param array $menu
+     * @return array
+     */
+    public function act(array $menu): array
+    {
+        $returnableAMenu = [];
+        foreach ($menu as $menuPoint) {
+
+            $depth = $menuPoint["depth"];
+
+            if ($depth === 1) {
+                $tempArray = array_pop($returnableAMenu);
+                $tempArray['submenu'][] = $menuPoint;
+                $returnableAMenu[] = $tempArray;
+            } else {
+                $returnableAMenu[] = $menuPoint;
+            }
+        }
+
+        return $returnableAMenu;
+    }
+}
diff --git a/src/Controller/PrepareMenuController.php b/src/Controller/PrepareMenuController.php
new file mode 100644
index 0000000000000000000000000000000000000000..49a74dd59b5600f956078046d942b7f9dfab405e
--- /dev/null
+++ b/src/Controller/PrepareMenuController.php
@@ -0,0 +1,26 @@
+<?php
+
+namespace App\Controller;
+
+use App\Actions\PrepareMenuAction;
+use App\Requests\MenuRequest;
+use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
+use Symfony\Component\HttpFoundation\JsonResponse;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\Routing\Attribute\Route;
+
+class PrepareMenuController extends AbstractController
+{
+    /**
+     * Контроллер реструктурирует массив меню добавляя вложенность по значению depth
+     * используюя prepareMenu функцию
+     * @param MenuRequest $request
+     * @param PrepareMenuAction $action
+     * @return Response
+     */
+    #[Route('/prepare/menu', name: 'app_prepare_menu', methods: ['POST'])]
+    public function index(MenuRequest $request, PrepareMenuAction $action): Response
+    {
+        return new JsonResponse($action->act($request->serialise()));
+    }
+}
diff --git a/src/Requests/MenuRequest.php b/src/Requests/MenuRequest.php
new file mode 100644
index 0000000000000000000000000000000000000000..99bf7832858bdbab9739ab66d52845988756873d
--- /dev/null
+++ b/src/Requests/MenuRequest.php
@@ -0,0 +1,32 @@
+<?php
+
+namespace App\Requests;
+
+use Symfony\Component\Validator\Constraints\All;
+use Symfony\Component\Validator\Constraints\Collection;
+use Symfony\Component\Validator\Constraints\NotBlank;
+use Symfony\Component\Validator\Constraints\Type;
+
+class MenuRequest extends BaseRequest
+{
+
+    #[Type('array')]
+    #[All(
+        constraints: new Collection(fields:[
+            'name' => [
+                new NotBlank(),
+                new Type('string'),
+            ],
+            'depth' => [
+                new NotBlank(),
+                new Type('integer'),
+            ]
+        ])
+    )]
+    public $menu;
+
+    public function serialise(): mixed
+    {
+        return $this->menu;
+    }
+}