bundle/w3des/AdminBundle/src/ArgumentResolver/EntityArgumentResolver.php line 57

Open in your IDE?
  1. <?php
  2. namespace w3des\AdminBundle\ArgumentResolver;
  3. use Symfony\Component\HttpFoundation\Request;
  4. use Symfony\Component\HttpKernel\Controller\ArgumentValueResolverInterface;
  5. use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadata;
  6. use Doctrine\ORM\EntityManagerInterface;
  7. use Doctrine\ORM\Mapping\MappingException;
  8. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  9. use Doctrine\DBAL\Exception\DriverException;
  10. /**
  11. * Support attributes on PHP8
  12. *
  13. */
  14. class EntityArgumentResolver implements ArgumentValueResolverInterface
  15. {
  16. private EntityManagerInterface $em;
  17. public function __construct(EntityManagerInterface $em)
  18. {
  19. $this->em = $em;
  20. }
  21. public function resolve(Request $request, ArgumentMetadata $argument)
  22. {
  23. $id = $this->getId($request, $argument);
  24. $model = null;
  25. if ($id) {
  26. try {
  27. $model = $this->em->getRepository($argument->getType())->find($id);
  28. } catch(DriverException $e) {
  29. throw new NotFoundHttpException();
  30. }
  31. } elseif ($argument->isNullable()) {
  32. yield null;
  33. return;
  34. }
  35. if ($model) {
  36. yield $model;
  37. } else {
  38. throw new NotFoundHttpException();
  39. }
  40. }
  41. public function supports(Request $request, ArgumentMetadata $argument)
  42. {
  43. if ($argument->getType() == Request::class || $argument->getType() === null) {
  44. return false;
  45. }
  46. if (! class_exists($argument->getType())) {
  47. return false;
  48. }
  49. try {
  50. return $this->em->getMetadataFactory()->getMetadataFor($argument->getType()) !== null;
  51. } catch (\Doctrine\Persistence\Mapping\MappingException $e) {
  52. return false;
  53. }
  54. }
  55. private function getId(Request $request, ArgumentMetadata $argument)
  56. {
  57. $name = $request->attributes->get('_entity', [])[$argument->getName()]??'id';
  58. return $request->attributes->get('_route_params')[$name]??null;
  59. }
  60. }