Symfony2:SonataAdminBundle - 如何在管理类中获取表示当前用户的对象?

时间:2014-02-27 13:10:22

标签: symfony fosuserbundle sonata-admin

我使用sonata-admin软件包。 我在PageEntity中与用户(FOSUserBundle)有关系。 我想保存创建或更改页面的当前用户。

我的猜测是获取admin类的postUpdate和postPersist方法中的用户对象,并且此对象在setUser方法中传输。

但是如何实现这个呢?

在google的小组中,我看到了

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

但这不起作用

2 个答案:

答案 0 :(得分:24)

在admin类中,您可以像这样获取当前登录的用户:

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

根据反馈进行编辑

你这样做了吗?因为这应该有用。

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

答案 1 :(得分:3)

从symfony 2.8开始,您应该使用security.token_storage而不是security.context来检索用户。使用构造函数注入在管理员中获取它:

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

admin.yml

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

然后使用$this->tokenStorage->getToken()->getUser()获取当前用户。