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 index fb46687b34eaffad98d5f90022e14ac2ba4988a2..1e3334fa6fe831cc930bae6abf725b2fb5054db6 100644 --- a/src/Controller/PrepareMenuController.php +++ b/src/Controller/PrepareMenuController.php @@ -2,28 +2,28 @@ 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\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Attribute\Route; -use function App\Repository\prepareMenu; class PrepareMenuController extends AbstractController { /** * Контроллер реÑтруктурирует маÑÑив меню добавлÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ð¾ÑÑ‚ÑŒ по значению depth * иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑŽÑ prepareMenu функцию - * @param Request $request + * @param MenuRequest $request + * @param PrepareMenuAction $action * @return Response */ #[Route('/prepare/menu', name: 'app_prepare_menu', methods: ['POST'])] - public function index(Request $request): Response + public function index(MenuRequest $request, PrepareMenuAction $action): Response { - $array = $request->toArray(); - - $return = prepareMenu($array); - - return new JsonResponse($return, Response::HTTP_OK); + return new JsonResponse( + $action->act($request->serialise()), + 200 + ); } } diff --git a/src/Repository/PrepareMenuRepository.php b/src/Repository/PrepareMenuRepository.php deleted file mode 100644 index e1be3c774078fe796b9151de73fb9c39e0d9fcf8..0000000000000000000000000000000000000000 --- a/src/Repository/PrepareMenuRepository.php +++ /dev/null @@ -1,29 +0,0 @@ -<?php - -namespace App\Repository; -/** - * Сгруппировать подразедлы в верхние разделы меню - * Дочерние Ñлементы помеÑтить в маÑÑив Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»Ñ Ñ ÐºÐ»ÑŽÑ‡Ð¾Ð¼ submenu - * Значение под ключом depth определÑет уровень раздела - * МаÑÑив $aMenu вÑегда начинаетÑÑ Ñ Ñлемента depth = 0, вÑе поÑледующие Ñлементы Ñ depth = 1 ÑвлÑÑŽÑ‚ÑÑ ÐµÐ³Ð¾ дочерними - * Ñлементами - * @param array $aMenu - * @return array - */ -function prepareMenu(array $aMenu): array { - $returnableAMenu = []; - foreach ($aMenu 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/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; + } +}