微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Sylius-将服务注入资源库

如何解决Sylius-将服务注入资源库

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

我到目前为止所做的:

  • 我为产品创建了一个自定义资源存储库,该资源存储库覆盖了createListQueryBuilder方法(并在_sylius.yaml中进行了注册)。

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

问题:

该服务已在存储库中设置,但是在调用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

        ...
    }
}

解决方法


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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。