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



我使用sonata-admin bundle。我与页面实体中的用户(FOSUserBundle)有关系。我想保存创建或更改页面的当前用户。

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

但是如何实现这一点呢?

在谷歌的小组上,我看到了

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

但这行不通

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

从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:
        - ~
        - YourEntity
        - ~
        - '@security.token_storage'

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

我在symfony的5.3.10版本和奏鸣曲的4.2版本上处理这个问题。greg0ire的回答真的很有帮助,还有来自symfony文档的这些信息,这是我的方法:

就我而言,我试图根据用户的属性设置自定义查询。

// ... 
use SymfonyComponentSecurityCoreSecurity;
final class YourClassAdmin extends from AbstractAdmin {
    // ... 
    private $security;
    public function __construct($code, $class, $baseControllerName, Security $security)
    {
        parent::__construct($code, $class, $baseControllerName);
        // Avoid calling getUser() in the constructor: auth may not
        // be complete yet. Instead, store the entire Security object.
        $this->security = $security;
    }
    // customize the query used to generate the list
    protected function configureQuery(ProxyQueryInterface $query): ProxyQueryInterface 
    {
        $query = parent::configureQuery($query);
        $rootAlias = current($query->getRootAliases());
        // ..
        $user = $this->security->getUser();
        // ...    
        return $query;
    }
}

相关内容

  • 没有找到相关文章

最新更新