Sylius — внедрение сервисов в репозитории ресурсов

Я хочу добавить функцию в AdminUser, чтобы администратор мог видеть только продукты/заказы и т. д., которые доступны в определенных каналах. Цель состоит в том, чтобы иметь интерфейс администратора и использовать sylius в качестве мультимагазинной платформы для разных клиентов с разными магазинами.

Что я сделал до сих пор:

  • Я создал собственный репозиторий ресурсов для продуктов, который переопределяет метод createListQueryBuilder (и, конечно же, зарегистрировал его в _sylius.yaml).

  • Поскольку мне нужна служба безопасности symfonys, а автосвязывание, похоже, не работает для дополнительных параметров в конструкторе репозитория, я создал CompilerPass, который добавляет вызов метода для установки службы безопасности (код ниже).

Проблема:

Служба устанавливается в репозитории, но когда вызывается метод createListQueryBuilder, он снова становится null, поэтому нет возможности фильтровать пользователя.

Похоже, что во время вызова используется другой экземпляр класса репозитория (spl_object_hash возвращает разные значения при вызове setSecurity и при вызове createListQueryBuilder).

Я что-то пропустил или есть еще какой-нибудь способ добавить эту функцию?

Силиус Версия 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

        ...
    }
}

person user2476294    schedule 07.10.2020    source источник
comment
Следовали ли вы этому руководству: docs.sylius.com/en/latest/customization/ репозиторий.html?   -  person Victor Vasiloi    schedule 07.10.2020


Ответы (1)



Или вы можете удалить зависимость от безопасности на уровне репозитория и создать уровень безопасности над репозиторием.

person user2838338    schedule 26.11.2020
comment
Это не ответ. Вместо этого рассмотрите возможность оставить комментарий. - person Tyler2P; 29.11.2020