gpt4 book ai didi

symfony - 在 Symfony 3 中获取 SQLFilter 内的用户

转载 作者:行者123 更新时间:2023-12-02 18:32:20 26 4
gpt4 key购买 nike

我从 Symfony 开始,想要制作一个 Multi-Tenancy 应用程序。

每当一个表与我的公司表有链接时,我想根据连接用户所属的公司自动过滤 SQL 查询中的内容。

我找到了创建过滤器的方法,但找不到在此过滤器中检索有关连接用户公司的信息的方法。

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

我的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 监听器,将其传递给 token 存储服务,以便它将您的用户定义为 SQLFilter 的参数。

所以在你的 services.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 "";
}
}

关于symfony - 在 Symfony 3 中获取 SQLFilter 内的用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50173308/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com