Symfony - Получить security.token_storage в репозиториях Sylius - PullRequest
0 голосов
/ 20 марта 2020

Я пытался внедрить security.token_storage сервис через CompilerPass, у меня нет ошибок, и пользователь в данный момент зарегистрирован, однако при доступе к TokenStorage $tokenStorage->getToken() я получил нулевой ответ.

Я проверил эти ссылки для ссылки, но мне не удалось получить действительный токен.

Как внедрить общий сервис из прохода компилятора в Symfony и Доступ в данный момент зарегистрированный пользователь в UserRepository в Sylius

У вас есть идея, почему он возвращает нулевой ответ?

  • Версия Sylius: 1.4 и Symfony 4.4

Класс пакета:

   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
    }


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



Ответы [ 2 ]

0 голосов
/ 22 марта 2020

По какой-то причине я не смог внедрить функцию построения репозитория или использовать метод установки сеттера в том виде, в каком мы его знаем.

Я попробовал несколько способов получить сеанс пользователя, и моим последним средством было перезаписать сетку 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()"
             .......
  • OrderRepository:
    class OrderRepository extends BaseOrderRepository
    {

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

0 голосов
/ 20 марта 2020

Я предполагаю, что токенохранилище не заполняется в момент выполнения компилятора. Есть ли у вас другая возможность справиться с этим в другой период времени, например, встроенное в ядро ​​событие kernel.request?

Кстати, пытался ли просто внедрить сервис \Sylius\Bundle\CoreBundle\Context\CustomerContext в репозиторий без компиляции?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...