首页 > 解决方案 > Symfony - 在 Sylius 存储库中获取 security.token_storage

问题描述

我试图通过 注入security.token_storage服务CompilerPass,我没有错误并且用户当前已登录,但是当我访问 TokenStorage 时,$tokenStorage->getToken()我得到了一个空响应。

我检查了这些链接以供参考,但我无法获得有效的令牌。

如何从 Symfony 中的编译器传递注入共享服务访问当前登录的用户在 Sylius 的 UserRepository 中

你知道为什么它返回空响应吗?

捆绑类:

   public function build(ContainerBuilder $container)
   {
       parent::build($container);
       $container->addCompilerPass(new ModifyRepositoryPass());
   }

ModifyRepositoryPass 类:

class ModifyRepositoryPass implements CompilerPassInterface
{

   public function process(ContainerBuilder $container)
   {
       $container
           ->getDefinition('sylius.repository.order')
           ->addMethodCall('getTokenStorage', array(
               new Reference('security.token_storage')
           ));

    }
  }

获取令牌:

class OrderRepository extends BaseOrderRepository
{

    /** @var TokenStorageInterface */
    protected $tokenStorage;

    public function getTokenStorage(TokenStorageInterface $tokenStorage)
    {
        $this->tokenStorage = $tokenStorage;
    }

    public function createListFilter()
    {

        $token = $this->tokenStorage->getToken()); //  NULL token
    }


配置.yml

sylius_order:
  resources:
    order:
      classes:
        repository: AppBundle\Repository\OrderRepository
         #method: getTokenStorage  also, I tried inject expression, but it does not work
         #arguments: ["tokenStorage", "expr:service('security.token_storage').getToken()"]



标签: phpsymfony4sylius

解决方案


出于某种原因,我无法注入到存储库构造函数或使用我们所知道的 setter 注入。

我尝试了几种方法来检索用户会话,我最后的手段是覆盖网格sylius_admin_order并使用表达式: expr:service('security.token_storage').getToken()

  • AdminBundle/Resources/config/grids/order.yml覆盖:vendor/sylius/sylius/src/Sylius/Bundle/AdminBundle/Resources/config/grids/order.yml
  sylius_grid:
   grids:
    sylius_admin_order:
      driver:
        name: doctrine/orm
        options:
          class: "%sylius.model.order.class%"
          repository:
            method: createListQueryBuilder
            arguments:
              usernamePasswordToken: "expr:service('security.token_storage').getToken()"
             .......
  • 订单仓库:
    class OrderRepository extends BaseOrderRepository
    {

     /**
     * @param UsernamePasswordToken|null $usernamePasswordToken
     * @return QueryBuilder
     */
    public function createListQueryBuilder($usernamePasswordToken = null): QueryBuilder
    {
      $user = $usernamePasswordToken->getUser();


推荐阅读