我正在使用Symfony 2构建一个Saas/Multitenant应用程序。我已经创建了一个Doctrine事件订阅者来添加和更新行的所有者,创建行的用户,修改行的用户,时间戳等等。
现在,我需要实现某种过滤器,这样,当用户登录时,他只能看到其公司的数据。虽然我的第一个操作是使用Doctrine preLoad事件,但是此事件不存在...据我所知,我必须使用Doctrine过滤器,不是吗?如果是这样,此过滤器如何访问用户数据以读取公司ID?我必须使用依赖注入(inject)来注入(inject)它吗?有什么标准的方法可以实现我的目标?
更新
我正在寻找的是创建某种Doctrine插件/ Hook ,因此每次我调用从数据库中获取数据的任何函数(find,findOneBy等)时,我正在获取的实体都实现了一个特定的接口(interface),一个额外的'AND company_id =:id'SQL序列被添加到生成的查询中,因此 Controller 或模型都不会从其他公司接收数据。
最佳答案
为此,您可以使用DoctrineFilter
官方文档Doctrine2 SQL Filters的链接
namespace Rwmt\Bundle\RwmtBundle\DoctrineFilters;
use Doctrine\ORM\Mapping\ClassMetaData,
Doctrine\ORM\Query\Filter\SQLFilter;
class MultiTenantFilter extends SQLFilter
{
public function addFilterConstraint(ClassMetadata $targetEntity, $targetTableAlias)
{
// Check if the entity implements the MultiTenant interface
if (!$targetEntity->reflClass->implementsInterface('Rwmt\Bundle\RwmtBundle\Entity\MultiTenant')) {
return "";
}
return $targetTableAlias.'.tenant_id = ' . $this->getParameter('tenantId');
}
}
并设置过滤器中使用的参数tenantId,您必须启用过滤器并设置参数
$filter = $em->getFilters()->enable('multi_tenant');
$filter->setParameter('tenantId', $tenant->getId(), 'integer');
至于MultiTenant接口(interface)只是实体要实现的东西
namespace Rwmt\Bundle\RwmtBundle\Entity;
use Rwmt\Bundle\RwmtBundle\Entity\Tenant;
interface MultiTenant
{
public function setTenant(Tenant $tenant);
public function getTenant();
}
关于php - Symfony2-创建一个Doctrine过滤器以选择当前的用户数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23747697/