Created
April 12, 2019 14:44
-
-
Save romaricdrigon/efbeade42de26a32776609168a1abaf7 to your computer and use it in GitHub Desktop.
Ajout d'un ParamConverter pour "User"
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
namespace App\Controller; | |
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; | |
use Symfony\Component\Security\Core\User\UserInterface; | |
class ExampleController extends AbstractController | |
{ | |
public function pageAvecUnUtilisateur(UserInterface $user) | |
{ | |
return new Response(sprintf('Hello %s!', $user->getUsername()); | |
} | |
public function pageAvecPeutEtreUnUtilisateur(?UserInterface $user) | |
{ | |
if ($user) { | |
return new Response(sprintf('Hello %s!', $user->getUsername()); | |
} | |
return new Response('Hello anonyme!'); | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
services: | |
# ... | |
# On déclare manuellement le ParamConverter afin de pouvoir configurer sa priorité | |
# Elle doit être > 0 pour éviter les conflits | |
# Mais <= 1 | |
App\ParamConverter\UserParamConverter: | |
class: App\ParamConverter\UserParamConverter | |
# Attention ici à utiliser le bon service, pas @security.csrf.token_storage | |
arguments: ["@security.token_storage"] | |
tags: | |
- { name: request.param_converter, priority: 1, converter: user } | |
# Le nom "user" pourra être utilisé pour désactiver sélectivement le converter |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
namespace App\ParamConverter; | |
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter; | |
use Sensio\Bundle\FrameworkExtraBundle\Request\ParamConverter\ParamConverterInterface; | |
use Symfony\Component\HttpFoundation\Request; | |
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface; | |
use Symfony\Component\Security\Core\User\UserInterface; | |
class UserParamConverter implements ParamConverterInterface | |
{ | |
private $tokenStorage; | |
public function __construct(TokenStorageInterface $tokenStorage) | |
{ | |
$this->tokenStorage = $tokenStorage; | |
} | |
/** | |
* {@inheritdoc} | |
* @throws \Exception | |
*/ | |
public function apply(Request $request, ParamConverter $configuration) | |
{ | |
$controllerArgumentName = $configuration->getName(); | |
if (!$this->tokenStorage->getToken() || !$this->tokenStorage->getToken()->getUser() instanceof UserInterface) { | |
// On veut autoriser un paramètre nullable (ie., UserInterface ?user) | |
if ($configuration->isOptional()) { | |
$request->attributes->set($controllerArgumentName, null); | |
return; | |
} | |
throw new \Exception('Impossible de trouver quel Utilisateur est connecté.' | |
.'Peut-être devez-vous activer un pare-feu (autre que anonymous) sur cette route?'); | |
} | |
$request->attributes->set($controllerArgumentName, $this->tokenStorage->getToken()->getUser()); | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public function supports(ParamConverter $configuration) | |
{ | |
// $configuration->getClass() retourne exactement la classe de l'argument du contrôleur | |
// Ici on utilise UserInterface de la sécurité Symfony | |
// Vous voudrez peut-être utiliser votre classe User à vous, ou une votre propre interface (mieux!) | |
return UserInterface::class === $configuration->getClass(); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment