如何解决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 举报,一经查实,本站将立刻删除。