Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Symfony 3中的SQLFilter中获取用户_Symfony_Doctrine Orm_Doctrine - Fatal编程技术网

在Symfony 3中的SQLFilter中获取用户

在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

我从Symfony开始,我想做一个多租户应用程序

我想在我的SQL查询中根据连接用户所属的公司自动筛选内容,每次表与我的公司表有链接时

我找到了创建筛选器的方法,但我找不到在该筛选器中检索有关所连接用户的公司信息的方法

我使用FOSuser,我用自己的用户类覆盖它

my config.yml

#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
方法。