【发布时间】: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