Sonata + Fos_user - 如何仅显示与用户相关的实体?

时间:2017-05-07 23:17:43

标签: symfony fosuserbundle sonata-admin sonata

我的用户是场地管理员。我希望他们能够管理他们在这些地方发生的地方和事件。

我创建了fos_user_user,并在那里建立了与地方的关系:

<entity name="Application\Sonata\UserBundle\Entity\User" table="fos_user_user">
    <id name="id" column="id" type="integer">
        <generator strategy="AUTO" />
    </id>
    <many-to-many field="places" target-entity="EchoBundle\Entity\Place">
        <join-table name="users_places">
            <join-columns>
                <join-column name="user_id" referenced-column-name="id" />
            </join-columns>
            <inverse-join-columns>
                <join-column name="place_id" referenced-column-name="id" />
            </inverse-join-columns>
        </join-table>
    </many-to-many>
</entity>

现在,我可以管理用户并添加他们管理的地点。它工作正常。

问题:

  1. 我如何过滤这样一旦他们登录后他们只能看到自己的位置?

  2. 如何让他们只将事件添加到自己的位置?目前,当您添加活动时,您可以选择完整的地点列表。

  3. 如何过滤所有事件,以便他们只能看到与他们管理的地点相关的事件?

  4. 我查看&#34;自定义用于生成列表的查询&#34;在Sonata文档中,但不知道如何使用它。我尝试在4年前添加StackOverflow答案中的安全查询,但它没有用。

1 个答案:

答案 0 :(得分:0)

在您的Admin类中,您可以覆盖createQuery(您应该检查并修复以下示例以符合您的应用模型);) 该解决方案将涵盖问题1和3.

public function createQuery($context = 'list')
{
    $query = parent::createQuery($context);

    $aliases = $query->getRootAliases();
    $query
        ->leftJoin($aliases[0] . '.users_places', 'users_places')
        ->andWhere($query->expr()->eq('users_places.user_id', ':user') )
        ->setParameter('user', $this->getConfigurationPool()->getContainer()->get('security.token_storage')->getToken()->getUser());

    return $query;
}

问题2: 如果您使用的是奏鸣曲formMapperconfigureFormFields方法,则可以在字段定义中传递自定义查询构建器。

$formMapper
    ->add('events', 'sonata_type_model', [
        'label' => 'Events',
        'placeholder' => 'Select ...',
        'required' => true,
        'query' => $blQueryBuilder,
    ]);