我正在使用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/

10-14 19:22