只允许用户在奏鸣曲中编辑自己的歌曲


Allow users to edit only their enities in sonata

我想允许一些用户添加新闻,但也不希望他们编辑彼此的新闻。因此登录到管理面板后,他们应该只能看到自己的新闻。我目前正在用奏鸣曲做这件事。

有什么配置吗?

我的服务yml:

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包含常规内容,所以放在这里没有意义。

您可以将安全上下文服务注入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]]