我已经扩展了SonataUserBundle,我想自定义Admin查询来限制列表:
class UserAdmin extends BaseUserAdmin
{
// ...
public function createQuery($context = 'list')
{
$query = parent::createQuery($context);
$query->andWhere(
$query->expr()->eq($query->getRootAlias().'.company', ':comp')
);
$query->setParameter('comp', $securityContext->user->getCompany());
return $query;
}
// ...
}
在这里,我试图让用户只看到他公司的用户
但$securityContext
未设置。
有人可以告诉我如何将安全上下文注入我的管理类吗?
答案 0 :(得分:7)
您必须在UserAdmin服务中注入安全上下文服务。
为此,您必须更新捆绑包的services.yml:
services:
# ...
sonata.admin.user:
class: My\ProjectBundle\Admin\UserAdmin
tags:
- {name: sonata.admin, manager_type: orm, group: users, label: users}
arguments:
- null
- Application\Sonata\UserBundle\Entity\User
- SonataAdminBundle:CRUD
- @security.context #forth argument
calls:
- [setTranslationDomain, [MyProjectBundle]]
- [setUserManager, [@fos_user.user_manager]]
在UserAdmin类中,覆盖构造函数:
namespace My\ProjectBundle\Admin;
class UserAdmin extends Admin
{
private $securityContext = null;
public function __construct($code, $class, $baseControllerName, $secutiryContext=null)
{
parent::__construct($code, $class, $baseControllerName);
$this->securityContext = $securityContext;
}
public function createQuery($context = 'list')
{
$query = parent::createQuery($context);
$query->andWhere(
$query->expr()->eq($query->getRootAlias().'.company', ':comp')
);
$query->setParameter('comp', $this->securityContext->user->getCompany());
return $query;
}
}
我没有测试此代码,但我使用此方法在sonata admin中注入service_container以使用Gedmo Uploadable管理文件上传。
希望这有帮助。
答案 1 :(得分:1)
我知道这是一个非常古老的问题,但是呢?
$user = $this->getConfigurationPool()->getContainer()->get('security.context')->getToken()->getUser();
public function createQuery($context = 'list') {
然后在setParameter
您可以使用$user->getCompany()
喜欢这个;
public function createQuery($context = 'list')
{
$user = $this->getConfigurationPool()->getContainer()->get('security.context')->getToken()->getUser();
$query = parent::createQuery($context);
$query->andWhere(
$query->expr()->eq($query->getRootAlias().'.company', ':comp')
);
$query->setParameter('comp', $user->getCompany());
return $query;
}