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; + } +}