Мой слушатель событий не работает из моего многоразового пакета в Symfony 4.1 - PullRequest
0 голосов
/ 27 сентября 2018

Короткая история: у меня есть некоторые трудности для правильного использования прослушивателя в моем пользовательском пакете "vendor".

Я кодирую повторно используемый пакет для платформы Symfony 4.1 (для управления пользователями).Я поместил весь пакет в это место нового проекта Symfony: myproject / lib / AcmeUserBundle / src /

Так же, как это Демонстрация

Поскольку мой пакет находится нанеобычное место, я изменил свой config / services.yaml следующим образом (на случай, если это уместно):

services:
    # default configuration for services in *this* file
    _defaults:
        autowire: true
        autoconfigure: true
        public: false      

    App\:
        resource: '../src/*'
        exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}'

    App\Controller\:
        resource: '../src/Controller'
        tags: ['controller.service_arguments']

    Acme\UserBundle\:
        resource: '../lib/AcmeUserBundle/src/*'
        exclude: '../lib/AcmeUserBundle/src/{DependencyInjection,Entity,Migrations,Tests}'

    Acme\UserBundle\Controller\:
        resource: '../lib/AcmeUserBundle/src/Controller'
        tags: ['controller.service_arguments']

Затем я закодировал форму входа в систему (вас это не волнует), и когдапользователь вошел в систему, я хочу обновить его последнюю информацию о времени и дате в базе данных.Поэтому я создал слушатель, следуя этому учебнику для события security.interactive_login:

<?php

namespace Acme\UserBundle\EventListener;

use DateTime;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;

class LoginListener
{
    /**
     * @var EntityManagerInterface
     */
    private $entityManager;

    /**
     * LoginListener constructor.
     *
     * @param EntityManagerInterface $entityManager
     */
    public function __construct(EntityManagerInterface $entityManager)
    {
        $this->entityManager = $entityManager;
    }

    /**
     * @param InteractiveLoginEvent $event
     */
    public function onSecurityInteractiveLogin(InteractiveLoginEvent $event)
    {
        // Get the User entity.
        $user = $event->getAuthenticationToken()->getUser();
        /** @var \Acme\UserBundle\Entity\User $user */
        $user->setLastLoggedAt(new DateTime());
        $this->entityManager->persist($user);
        $this->entityManager->flush();
    }
}

lib / AcmeUserBundle / src / Resources / config / services.yaml выглядит так:

services:
    Acme\UserBundle\EventListener\LoginListener:
        tags:
            - { name: kernel.event_listener, event: security.interactive_login }

lib / AcmeUserBundle / src / DependencyInjection / AcmeUserExtension.php выглядит так:

class AcmeUserExtension extends Extension
{
    /**
     * @param array            $configs
     * @param ContainerBuilder $container
     */
    public function load(array $configs, ContainerBuilder $container)
    {
        $loader = new YamlFileLoader(
            $container,
            new FileLocator(__DIR__.'/../Resources/config')
        );
        $loader->load('services.yaml');
    }
}

Я вижу свой сервис, используя следующие команды symfony: php bin/console debug:autowiring php bin/console debug:container Но я ничего не вижу с помощью: php bin/console debug:event-dispatcher

Когда я вхожу в систему со своим пользователем, ошибки не возникает,и, конечно же, дата не вставляется в базу данных.Вот почему я думаю, что мой слушатель не зарегистрирован должным образом.

Есть идеи почему?

РЕДАКТИРОВАТЬ после комментария Керада:

Вывод php bin/console debug:container LoginListener

 ---------------- ------------------------------------------------
  Option           Value
 ---------------- ------------------------------------------------
  Service ID       Acme\UserBundle\EventListener\LoginListener
  Class            Acme\UserBundle\EventListener\LoginListener
  Tags             -
  Public           no
  Synthetic        no
  Lazy             no
  Shared           yes
  Abstract         no
  Autowired        yes
  Autoconfigured   yes
 ---------------- ------------------------------------------------

Мы видим, что часть Tags пуста.Вот почему мой слушатель игнорируется.И ... это работает, если я прокомментирую эту часть моего config / service.yaml :

...
    #Acme\UserBundle\:
    #    resource: '../lib/AcmeUserBundle/src/*'
    #    exclude: '../lib/AcmeUserBundle/src/{DependencyInjection,Entity,Migrations,Tests}'
...

Новый вывод php bin/console debug:container LoginListener

 ---------------- -----------------------------------------------------------
  Option           Value
 ---------------- -----------------------------------------------------------
  Service ID       Acme\UserBundle\EventListener\LoginListener
  Class            Acme\UserBundle\EventListener\LoginListener
  Tags             kernel.event_listener (event: security.interactive_login)
  Public           no
  Synthetic        no
  Lazy             no
  Shared           yes
  Abstract         no
  Autowired        no
  Autoconfigured   no
 ---------------- -----------------------------------------------------------

Теги теперь верны, и мой слушатель работает правильно

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