【问题标题】:Sylius - Inject Services into Resource RepositoriesSylius - 将服务注入资源库
【发布时间】:2020-10-07 12:41:13
【问题描述】:

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

到目前为止我做了什么:

  • 我为覆盖createListQueryBuilder 方法的产品创建了一个自定义资源存储库(当然,它已在_sylius.yaml 中注册)。

  • 由于我需要 symfonys 安全服务并且自动装配似乎不适用于存储库构造函数中的其他参数,因此我创建了一个 CompilerPass,它添加了一个方法调用来设置安全服务(代码如下)。

问题:

服务在存储库中设置,但是当createListQueryBuilder 方法被调用时,它又是null - 因此无法过滤特定用户。

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

我是否缺少某些东西或者是否有其他更多的 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

        ...
    }
}

【问题讨论】:

标签: symfony dependency-injection sylius


【解决方案1】:

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

【讨论】:

  • 这不是答案。请考虑发表评论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-24
相关资源
最近更新 更多