【问题标题】:Symfony - Get security.token_storage in Sylius repositoriesSymfony - 在 Sylius 存储库中获取 security.token_storage
【发布时间】:2020-03-20 03:34:19
【问题描述】:

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

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

How to inject shared service from compiler pass in SymfonyAccess currently logged in user in UserRepository in Sylius

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

  • Sylius 版本:1.4 和 Symfony 4.4

捆绑类:

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

修改RepositoryPass 类:

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
    }


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



【问题讨论】:

  • 用户退出时返回Null,你确定吗?您是否使用 Symfony Profiler Security 选项卡检查了这些请求?
  • 用户已登录,实际上,如果我从控制器检索令牌,我会得到一个有效的令牌,但是当我尝试使用 compilerPass 时它为空。

标签: php symfony4 sylius


【解决方案1】:

我的猜测是因为在 compilerpass 执行时刻没有填充令牌存储。您是否还有机会在另一个时间段处理它,例如内置内核事件kernel.request

顺便说一句,是否尝试将\Sylius\Bundle\CoreBundle\Context\CustomerContext 服务注入存储库,而无需编译器通行证?

【讨论】:

  • 感谢您的回复,在那种情况下,您知道如何在我的自定义存储库中注入 CustomerContext 吗?,我将我的存储库添加到问题中
  • CustomerContext 添加到存储库构造器并在其方法中使用。构造函数注入示例symfony.com/doc/current/…
【解决方案2】:

由于某种原因,我无法注入到存储库构造函数或使用我们所知道的 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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多