Я хочу добавить функцию в 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
...
}
}