简体   繁体   English

Symfony - 在 Sylius 存储库中获取 security.token_storage

[英]Symfony - Get security.token_storage in Sylius repositories

I have tried to inject security.token_storage service via CompilerPass , I do not have errors and user is currently logged, however when I access the TokenStorage, $tokenStorage->getToken() I got a null response.我尝试通过CompilerPass注入security.token_storage服务,我没有错误并且用户当前已记录,但是当我访问 TokenStorage 时, $tokenStorage->getToken()我得到了一个空响应。

I checked these links to reference, but I cannot achieve to get a valid token.我检查了这些链接以供参考,但我无法获得有效的令牌。

How to inject shared service from compiler pass in Symfony and Access currently logged in user in UserRepository in Sylius 如何从 Symfony 中的编译器传递访问当前登录用户在 Sylius 的 UserRepository 中注入共享服务

Do you an idea why it returns null response?你知道为什么它返回空响应吗?

  • Sylius version: 1.4 and Symfony 4.4 Sylius 版本:1.4 和 Symfony 4.4

Bundle class:捆绑类:

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

ModifyRepositoryPass class: ModifyRepositoryPass 类:

class ModifyRepositoryPass implements CompilerPassInterface
{

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

    }
  }

Get token:获取令牌:

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
    }


Config.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()"]



My guess is because tokenstorage is not populated at the compilerpass execution moment.我的猜测是因为在编译器传递执行时刻没有填充令牌存储。 Do you have another oportunity to handle it on another time period, for example built-in kernel event kernel.request ?您是否有其他机会在另一个时间段处理它,例如内置内核事件kernel.request

By the way, did tried just to inject \\Sylius\\Bundle\\CoreBundle\\Context\\CustomerContext service into repository, without compilerpass?顺便说一句,是否尝试过将\\Sylius\\Bundle\\CoreBundle\\Context\\CustomerContext服务注入存储库,而没有编译器通过?

For some reason, I could not inject to repository construct function or use setter injection as we know it.出于某种原因,我无法注入存储库构造函数或使用我们所知道的 setter 注入。

I tried several ways to retrieve user session and my last resort was overwrite the grid sylius_admin_order and use an expression: expr:service('security.token_storage').getToken()我尝试了几种方法来检索用户会话,最后的手段是覆盖网格sylius_admin_order并使用表达式: expr:service('security.token_storage').getToken()

  • AdminBundle/Resources/config/grids/order.yml overwrite: vendor/sylius/sylius/src/Sylius/Bundle/AdminBundle/Resources/config/grids/order.yml 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()"
             .......
  • OrderRepository:订单库:
    class OrderRepository extends BaseOrderRepository
    {

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM