Skip to content

Instantly share code, notes, and snippets.

@romaricdrigon
Created April 12, 2019 14:44
Show Gist options
  • Save romaricdrigon/efbeade42de26a32776609168a1abaf7 to your computer and use it in GitHub Desktop.
Save romaricdrigon/efbeade42de26a32776609168a1abaf7 to your computer and use it in GitHub Desktop.
Ajout d'un ParamConverter pour "User"
<?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!');
}
}
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
<?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