Sonata + Fos_user - 如何只显示与用户相关的实体?
Sonata + Fos_user - How to display only entities related to the user?
我有一些用户是场馆管理员。我希望他们能够管理他们的场所和在这些场所发生的事件。
我创建了 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>
现在,我可以管理用户并添加他们管理的地点。它工作正常。
问题:
如何进行过滤,以便他们在登录后只能看到自己的位置?
我怎样才能让他们只在他们自己的地方添加活动?目前,当您添加一个事件时,您有一个完整的地点列表 select。
如何过滤所有事件,以便他们只看到与他们管理的地点相关的事件?
我查看了 Sonata 文档中的 "CUSTOMIZING THE QUERY USED TO GENERATE THE LIST",但不知道如何使用它。我试图添加 4 年前在 Whosebug 上的答案中找到的安全查询,但它没有用。
在您的管理员 class 中,您可以覆盖 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;
}
问题二:
如果您正在使用 sonata formMapper
和 configureFormFields
方法,您可以在字段定义中传递 Custom Query Builder。
$formMapper
->add('events', 'sonata_type_model', [
'label' => 'Events',
'placeholder' => 'Select ...',
'required' => true,
'query' => $blQueryBuilder,
]);
我有一些用户是场馆管理员。我希望他们能够管理他们的场所和在这些场所发生的事件。
我创建了 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>
现在,我可以管理用户并添加他们管理的地点。它工作正常。
问题:
如何进行过滤,以便他们在登录后只能看到自己的位置?
我怎样才能让他们只在他们自己的地方添加活动?目前,当您添加一个事件时,您有一个完整的地点列表 select。
如何过滤所有事件,以便他们只看到与他们管理的地点相关的事件?
我查看了 Sonata 文档中的 "CUSTOMIZING THE QUERY USED TO GENERATE THE LIST",但不知道如何使用它。我试图添加 4 年前在 Whosebug 上的答案中找到的安全查询,但它没有用。
在您的管理员 class 中,您可以覆盖 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;
}
问题二:
如果您正在使用 sonata formMapper
和 configureFormFields
方法,您可以在字段定义中传递 Custom Query Builder。
$formMapper
->add('events', 'sonata_type_model', [
'label' => 'Events',
'placeholder' => 'Select ...',
'required' => true,
'query' => $blQueryBuilder,
]);