Symfony2: SonataAdminBundle - How can i get the object representing the current user inside an admin class?

StackOverflow https://stackoverflow.com//questions/22069541

Question

I use the sonata-admin bundle. I have the relationship with the user (FOSUserBundle) in the PageEntity. I want to save the current user which create or change a page.

My guess is get the user object in postUpdate and postPersist methods of the admin class and this object transmit in setUser method.

But how to realize this?

On the google's group I saw

    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());
    }

but this doesn't work

Was it helpful?

Solution

In the admin class you can get the current logged in user like this:

$this->getConfigurationPool()->getContainer()->get('security.token_storage')->getToken()->getUser()

EDIT based on feedback

And you are doing it this? Because this should work.

 /**
     * {@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);
    }

OTHER TIPS

Starting with symfony 2.8, you should use security.token_storage instead of security.context to retrieve the user. Use constructor injection to get it in your admin:

public function __construct(
    $code,
    $class,
    $baseControllerName,
    TokenStorageInterface $tokenStorage
) {
    parent::__construct($code, $class, $baseControllerName);
    $this->tokenStorage = $tokenStorage;
}

admin.yml :

    arguments:
        - ~
        - Your\Entity
        - ~
        - '@security.token_storage'

then use $this->tokenStorage->getToken()->getUser() to get the current user.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top