Commit 2937ba8b authored by Александр Плохих's avatar Александр Плохих 🌔
Browse files

create controller and action menu prepare and req

parent 1f366036
Loading
Loading
Loading
Loading
+35 −0
Original line number Diff line number Diff line
<?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;
    }
}
+9 −9
Original line number Diff line number Diff line
@@ -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
        );
    }
}
+0 −29
Original line number Diff line number Diff line
<?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;
}
+32 −0
Original line number Diff line number Diff line
<?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;
    }
}