Приветствую!
Хотелось бы уточнить, узнать.
На сколько верны действия?
- Требуется валидация параметров, до того как они попадут в контроллер
- Уменьшения количества говно кода в контроллерах.
Пример использования.
<?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)
{
// модификация, персист, флуш
}