Короткая история: у меня есть некоторые трудности для правильного использования прослушивателя в моем пользовательском пакете "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
---------------- -----------------------------------------------------------
Теги теперь верны, и мой слушатель работает правильно