Symfony2 :SonataAdminBundle - Comment puis-je obtenir l'objet représentant l'utilisateur actuel dans une classe d'administrateur ?
-
23-12-2019 - |
Question
J'utilise le bundle sonata-admin.J'ai la relation avec l'utilisateur (FOSUserBundle) dans PageEntity.Je souhaite enregistrer l'utilisateur actuel qui crée ou modifie une page.
Je suppose que j'obtiens l'objet utilisateur dans les méthodes postUpdate et postPersist de la classe admin et que cet objet est transmis dans la méthode setUser.
Mais comment s’en rendre compte ?
Sur le groupe Google, j'ai vu
public function setSecurityContext($securityContext) {
$this->securityContext = $securityContext;
}
public function getSecurityContext() {
return $this->securityContext;
}
public function prePersist($article) {
$user = $this->getSecurityContext()->getToken()->getUser();
$appunto->setOperatore($user->getUsername());
}
mais ça ne marche pas
La solution
Dans la classe d'administration, vous pouvez obtenir l'utilisateur actuel connecté comme celui-ci:
$this->getConfigurationPool()->getContainer()->get('security.token_storage')->getToken()->getUser()
Et vous le faites cela?Parce que cela devrait fonctionner.
/**
* {@inheritdoc}
*/
public function prePersist($object)
{
$user = $this->getConfigurationPool()->getContainer()->get('security.token_storage')->getToken()->getUser();
$object->setUser($user);
}
/**
* {@inheritdoc}
*/
public function preUpdate($object)
{
$user = $this->getConfigurationPool()->getContainer()->get('security.token_storage')->getToken()->getUser();
$object->setUser($user);
}
Autres conseils
À partir de Symfony 2.8, vous devez utiliser security.token_storage
au lieu de security.context
pour récupérer l'utilisateur.Utilisez l'injection de constructeur pour l'obtenir dans votre administrateur :
public function __construct(
$code,
$class,
$baseControllerName,
TokenStorageInterface $tokenStorage
) {
parent::__construct($code, $class, $baseControllerName);
$this->tokenStorage = $tokenStorage;
}
admin.yml
:
arguments:
- ~
- Your\Entity
- ~
- '@security.token_storage'
puis utilise $this->tokenStorage->getToken()->getUser()
pour obtenir l'utilisateur actuel.