在Symfony 3中的SQLFilter中获取用户
我从Symfony开始,我想做一个多租户应用程序 我想在我的SQL查询中根据连接用户所属的公司自动筛选内容,每次表与我的公司表有链接时 我找到了创建筛选器的方法,但我找不到在该筛选器中检索有关所连接用户的公司信息的方法 我使用FOSuser,我用自己的用户类覆盖它 my config.yml在Symfony 3中的SQLFilter中获取用户,symfony,doctrine-orm,doctrine,Symfony,Doctrine Orm,Doctrine,我从Symfony开始,我想做一个多租户应用程序 我想在我的SQL查询中根据连接用户所属的公司自动筛选内容,每次表与我的公司表有链接时 我找到了创建筛选器的方法,但我找不到在该筛选器中检索有关所连接用户的公司信息的方法 我使用FOSuser,我用自己的用户类覆盖它 my config.yml #app\config\config.yml doctrine: dbal: ... orm: auto_genera
#app\config\config.yml
doctrine:
dbal:
...
orm:
auto_generate_proxy_classes: '%kernel.debug%'
naming_strategy: doctrine.orm.naming_strategy.underscore
auto_mapping: true
filters:
company:
class: 'Acme\CompanyBundle\Repository\Filters\CompanyFilter'
enabled: true
我的过滤器
<?php
#src\Acme\CompanyBundle\Repository\Filters\CompanyFilter.php
namespace Acme\CompanyBundle\Repository\Filters;
use Doctrine\ORM\Mapping\ClassMetaData;
use Doctrine\ORM\Query\Filter\SQLFilter;
use Acme\UserBundle\Entity\UserEntity;
use Acme\CompanyBundle\Entity\CompanyEntity;
class CompanyFilter extends SQLFilter
{
public function addFilterConstraint(ClassMetadata $targetEntity, $targetTableAlias)
{
if ($targetEntity->hasAssociation("company")) {
// here how to get the connected user ???
$company = $user->getCompany();
$idCompany = $company->getId();
return $targetTableAlias . ".company_id = '".$idCompany."'";
}
return "";
}
}
设置onKernelRequest侦听器,将令牌存储服务传递给它,以便它将用户定义为SQLFilter的参数
因此,在您的服务中。yml添加:
services:
on_request_listener:
class: Acme\CompanyBundle\EventListener\OnRequestListener
arguments: ["@doctrine.orm.entity_manager", "@security.token_storage"]
tags:
-
name: kernel.event_listener
event: kernel.request
method: onKernelRequest
创建侦听器:
class OnRequestListener
{
protected $em;
protected $tokenStorage;
public function __construct($em, $tokenStorage)
{
$this->em = $em;
$this->tokenStorage = $tokenStorage;
}
public function onKernelRequest(GetResponseEvent $event)
{
if($this->tokenStorage->getToken()) {
$user = $this->tokenStorage->getToken()->getUser();
$filter = $this->em->getFilters()->enable('company');
$filter->setParameter('user', $user);
}
}
}
最后,您的SQLFilter:
<?php
#src\Acme\CompanyBundle\Repository\Filters\CompanyFilter.php
namespace Acme\CompanyBundle\Repository\Filters;
use Doctrine\ORM\Mapping\ClassMetaData;
use Doctrine\ORM\Query\Filter\SQLFilter;
use Acme\UserBundle\Entity\UserEntity;
use Acme\CompanyBundle\Entity\CompanyEntity;
class CompanyFilter extends SQLFilter
{
public function addFilterConstraint(ClassMetadata $targetEntity, $targetTableAlias)
{
if ($targetEntity->hasAssociation("company") && $this->hasParameter('user')) {
$user = $this->getParameter('user');
$company = $user->getCompany();
$idCompany = $company->getId();
return $targetTableAlias . ".company_id = '".$idCompany."'";
}
return "";
}
}
谢谢你的回答,但是我在onKernelRequest函数中有一个错误:在null上调用成员函数getUser()
实际上,我添加了一个条件,当然也有没有令牌集的情况。我忘了使用使用Symfony\Component\Security\Core\User\UserInterface代码>现在在SQLFilter中我有一个错误,它不知道getParameter('user')
更新了答案,我的错。如果我们不总是设置用户参数,我们只需要在设置所述用户参数时设置SQL筛选器(取决于它)。我不会通过$filter->setParameter('user',$user)
将用户添加到筛选器中,因为setParameter
需要一个字符串(虽然未验证,但可能在将来)。我宁愿在存储用户的CompanyFilter
中添加一个额外的setUser
方法。