Skip to content
Snippets Groups Projects
Commit 2937ba8b authored by Александр Плохих's avatar Александр Плохих :waxing_gibbous_moon:
Browse files

create controller and action menu prepare and req

parent 1f366036
No related branches found
No related tags found
1 merge request!4Ptps|controller 4
<?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;
}
}
...@@ -2,28 +2,28 @@ ...@@ -2,28 +2,28 @@
namespace App\Controller; namespace App\Controller;
use App\Actions\PrepareMenuAction;
use App\Requests\MenuRequest;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route; use Symfony\Component\Routing\Attribute\Route;
use function App\Repository\prepareMenu;
class PrepareMenuController extends AbstractController class PrepareMenuController extends AbstractController
{ {
/** /**
* Контроллер реструктурирует массив меню добавляя вложенность по значению depth * Контроллер реструктурирует массив меню добавляя вложенность по значению depth
* используюя prepareMenu функцию * используюя prepareMenu функцию
* @param Request $request * @param MenuRequest $request
* @param PrepareMenuAction $action
* @return Response * @return Response
*/ */
#[Route('/prepare/menu', name: 'app_prepare_menu', methods: ['POST'])] #[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 new JsonResponse(
$action->act($request->serialise()),
$return = prepareMenu($array); 200
);
return new JsonResponse($return, Response::HTTP_OK);
} }
} }
<?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;
}
<?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;
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment