Задать вопрос

Symfony, Argument resolver используется по назначению?

Приветствую!

Хотелось бы уточнить, узнать.

На сколько верны действия?

- Требуется валидация параметров, до того как они попадут в контроллер
- Уменьшения количества говно кода в контроллерах.

Пример использования.

<?php


namespace App\ArgumentResolver;


use App\Entity\Product;
use App\Repository\ProductRepository;
use Doctrine\ORM\EntityManagerInterface;
use Exception;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Controller\ArgumentValueResolverInterface;
use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadata;

/**
 * Class ProductValueResolver
 * @package App\ArgumentResolver
 */
class ProductValueResolver implements ArgumentValueResolverInterface
{
    private EntityManagerInterface $em;
    private ProductRepository $products_repository;

    /**
     * ProductValueResolver constructor.
     * @param EntityManagerInterface $em
     */
    public function __construct(EntityManagerInterface $em)
    {
        $this->em = $em;
        $this->products_repository = $em->getRepository(Product::class);
    }

    /**
     * @inheritDoc
     */
    public function supports(Request $request, ArgumentMetadata $argument)
    {
       return Product::class == $argument->getType();
    }

    /**
     * @inheritDoc
     * @throws Exception
     */
    public function resolve(Request $request, ArgumentMetadata $argument)
    {
        if (!$request->get("product_id", false)) {
            throw new Exception("Ошибка!");
        }

        $product = $this->products_repository->getById($request->get("product_id"));

        if (!is_a($product, $this->products_repository->getClassName())) {
            throw new Exception("Ошибка, объект не пренадлежит классу!");
        }

        yield $product;
    }
}


// В контроллере
/**
     * @Route(
     *     path="/products.edit",
     *     methods={"POST"}
     * )
     * @param Product $product
     * @return JsonResponse
     */
    public function edit(Product $product)
    {
     // модификация, персист, флуш
    }
  • Вопрос задан
  • 1471 просмотр
Подписаться 2 Простой 5 комментариев
Пригласить эксперта
Ответы на вопрос 1
Maksclub
@Maksclub
maksfedorov.ru
Можно только поабстрактней сделать, чобы любая сущность попадала и проверялась, если указзали, а не для каждой делатьсвой, но оставить такую возможность

Так неявно сделано в разных админ-панелях. Только не в аргументах контроллера, а просто в реквесте, в EasyAdmin так
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы