我使用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;
}
}