Symfony Sylius-将服务注入资源存储库

Symfony Sylius-将服务注入资源存储库,symfony,dependency-injection,sylius,Symfony,Dependency Injection,Sylius,我想向AdminUser添加一个功能,以便管理员只能看到特定渠道中提供的产品/订单等。其目的是要有一个管理界面,并使用sylius作为一个多商店平台,为不同的客户提供不同的商店 到目前为止我所做的: 我为覆盖createListQueryBuilder方法的产品创建了一个自定义资源库,并在_sylius.yaml中注册了它 由于我需要symfonys安全服务,而且对于存储库构造函数中的其他参数,自动连线似乎不起作用,因此我创建了一个编译器类,它添加了一个方法调用来设置下面的安全服务代码 问题:

我想向AdminUser添加一个功能,以便管理员只能看到特定渠道中提供的产品/订单等。其目的是要有一个管理界面,并使用sylius作为一个多商店平台,为不同的客户提供不同的商店

到目前为止我所做的:

我为覆盖createListQueryBuilder方法的产品创建了一个自定义资源库,并在_sylius.yaml中注册了它

由于我需要symfonys安全服务,而且对于存储库构造函数中的其他参数,自动连线似乎不起作用,因此我创建了一个编译器类,它添加了一个方法调用来设置下面的安全服务代码

问题:

该服务在存储库中设置,但当调用createListQueryBuilder方法时,它再次为null,因此无法筛选特定于用户的服务

在调用过程中,似乎使用了存储库类的另一个实例。调用setSecurity时,spl_object_hash返回的值与调用createListQueryBuilder时不同

我是否遗漏了一些东西,或者是否有其他更多的sylius方法来添加此功能

Sylius版本1.8.0

代码:

ProductRepositoryCompilerPass

自定义产品存储库


或者,您可以在存储库级别删除对安全性的依赖,并在存储库之上创建一个安全层。

您是否遵循了以下指南:?这不是答案。请考虑留下评论。

namespace App\DependencyInjection;

use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\Security\Core\Security;

/**
 * Class ProductRepositoryCompilerPass
 *
 * This class injects the security service into the product repository for filtering.
 * @package App\DependencyInjection
 */
class ProductRepositoryCompilerPass implements CompilerPassInterface
{
    public function process(ContainerBuilder $container)
    {
        if($container->hasDefinition('sylius.repository.product')) {
            $definition = $container->getDefinition('sylius.repository.product');
            $definition->addMethodCall('setSecurity', [new Reference(Security::class)]);
        }
    }
}


namespace App\Repository\Product;


use Doctrine\ORM\EntityManager;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\Mapping;
use Doctrine\ORM\QueryBuilder;
use Symfony\Component\Security\Core\Security;

class ProductRepository extends \Sylius\Bundle\CoreBundle\Doctrine\ORM\ProductRepository
{
    private $security;
    public function __construct(EntityManager $entityManager, Mapping\ClassMetadata $class)
    {
        parent::__construct($entityManager, $class);
    }

    public function setSecurity(Security $security) {
       $this->security = $security; // this gets called properly
    }

    public function createListQueryBuilder(string $locale, $taxonId = null): QueryBuilder
    {
        // $this->security is null here

        ...
    }
}