<?php
namespace w3des\AdminBundle\ArgumentResolver;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Controller\ArgumentValueResolverInterface;
use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadata;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\Mapping\MappingException;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Doctrine\DBAL\Exception\DriverException;
/**
* Support attributes on PHP8
*
*/
class EntityArgumentResolver implements ArgumentValueResolverInterface
{
private EntityManagerInterface $em;
public function __construct(EntityManagerInterface $em)
{
$this->em = $em;
}
public function resolve(Request $request, ArgumentMetadata $argument)
{
$id = $this->getId($request, $argument);
$model = null;
if ($id) {
try {
$model = $this->em->getRepository($argument->getType())->find($id);
} catch(DriverException $e) {
throw new NotFoundHttpException();
}
} elseif ($argument->isNullable()) {
yield null;
return;
}
if ($model) {
yield $model;
} else {
throw new NotFoundHttpException();
}
}
public function supports(Request $request, ArgumentMetadata $argument)
{
if ($argument->getType() == Request::class || $argument->getType() === null) {
return false;
}
if (! class_exists($argument->getType())) {
return false;
}
try {
return $this->em->getMetadataFactory()->getMetadataFor($argument->getType()) !== null;
} catch (\Doctrine\Persistence\Mapping\MappingException $e) {
return false;
}
}
private function getId(Request $request, ArgumentMetadata $argument)
{
$name = $request->attributes->get('_entity', [])[$argument->getName()]??'id';
return $request->attributes->get('_route_params')[$name]??null;
}
}