Разрешить пользователям редактировать только свои энты в сонате

Я хочу, чтобы некоторые пользователи могли добавлять новости, но я также не хочу, чтобы они редактировали новости друг друга. Так после входа в админку они должны видеть только свои новости. В настоящее время я делаю это с сонатой.

Есть ли конфигурация для этого?

Мой сервис.

services:
sonata.admin.news:
class: MyBundle\Admin\NewsAdmin
tags:
- { name: sonata.admin, manager_type: orm, group: "Content", label: "News" }
arguments:
- ~
- MyBundle\Entity\News
- ~
- "@doctrine.orm.entity_manager"calls:
- [ setTranslationDomain, [MyBundle]]

NewsAdmin содержит обычные вещи, поэтому нет смысла помещать их здесь.

1

Решение

Вы можете внедрить службу контекста безопасности в ваш NewsAdmin

class NewsAdmin extends Admin
{
protected $security;
protected $em;

public function __construct($code, $class, $baseControllerName, $entityManager, SecurityContext $security)
{
parent::__construct($code, $class, $baseControllerName);

$this->em = $entityManager;
$this->security = $security;
}

public function getNewInstance()
{
$news = parent::getNewInstance();
$news->setUser($this->security->getToken()->getUser());

return $formDefinition;
}

public function createQuery($context = 'list')
{
$queryBuilder = $this->getModelManager()->getEntityManager($this->getClass())->createQueryBuilder();

$queryBuilder
->select('news')
->from($this->getClass(), 'news')
->andWhere('news.user = :user')
->setParameter(':user', $this->security->getToken()->getUser());

$proxyQuery = new ProxyQuery($queryBuilder);
return $proxyQuery;
}

И в вашем определении администратора:

services:
sonata.admin.news:
class: MyBundle\Admin\NewsAdmin
tags:
- { name: sonata.admin, manager_type: orm, group: "Content", label: "News" }
arguments:
- ~
- MyBundle\Entity\News
- ~
- "@doctrine.orm.entity_manager"- "@security.context"calls:
- [ setTranslationDomain, [MyBundle]]
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]