AccessContextBuilder.php 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Serializer;
  4. use ApiPlatform\Serializer\SerializerContextBuilderInterface;
  5. use Symfony\Component\HttpFoundation\Request;
  6. use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
  7. use App\Entity\Access\Access;
  8. use Symfony\Bundle\SecurityBundle\Security;
  9. /**
  10. * Classe servant à ajouter le groupe de denormalization à la ressource Access par rapport au role de l'utilisateur
  11. */
  12. final class AccessContextBuilder implements SerializerContextBuilderInterface
  13. {
  14. public function __construct(
  15. private SerializerContextBuilderInterface $decorated,
  16. private AuthorizationCheckerInterface $authorizationChecker,
  17. private Security $security
  18. )
  19. { }
  20. public function createFromRequest(Request $request, bool $normalization, ?array $extractedAttributes = null): array
  21. {
  22. $context = $this->decorated->createFromRequest($request, $normalization, $extractedAttributes);
  23. $resourceClass = $context['resource_class'] ?? null;
  24. //On ajoute un nouveau groupe seulement si : la ressource est Access, on est en denormalization, l'utilisateur n'a pas le ROLE_USERS
  25. //et la denormalization est faite sur l'Access de l'utilisateur connecté
  26. /** @var Access $access */
  27. $access = $this->security->getUser();
  28. if (
  29. $resourceClass === Access::class &&
  30. false === $normalization &&
  31. !$this->authorizationChecker->isGranted('ROLE_USERS') &&
  32. (int) $request->get('id') === $access->getId()
  33. ){
  34. $context['groups'] = $context['groups'] ?? [];
  35. $context['groups'][] = 'my_access:input';
  36. }
  37. return $context;
  38. }
  39. }