У меня есть AppAuthAuthenticator, и при onAuthenticationFailure я отправляю событие:
if ($count === self::NOTIFY_ATTEMPTS) {
$this->eventDispatcher->dispatch(new TooManyWrongLoginAttemptsEvent($user));
}
в TooManyWrongLoginAttemptsEvent
Я отображаю (с окружающей средой) сообщение электронной почты и отправляю его на шину.
Iиметь TimezoneListener:
namespace App\EventListener;
use App\DoctrineDBALTypes\UTCDateTimeType;
use App\Entity\User;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Doctrine\DBAL\Types\Type;
use Twig\Environment;
class TimezoneListener
{
/** @var TokenStorageInterface */
private $tokenStorage;
/** @var Environment */
private $twig;
/**
* @param TokenStorageInterface $token_storage
* @param Environment $twig
*/
public function __construct(TokenStorageInterface $token_storage, Environment $twig) {
$this->tokenStorage = $token_storage;
$this->twig = $twig;
}
/**
*
* @param RequestEvent $event
*
* @throws \Doctrine\DBAL\DBALException
*/
public function onKernelRequest(RequestEvent $event) {
$token = $this->tokenStorage->getToken();
// override doctrine datetime class
Type::overrideType('datetime', UTCDateTimeType::class);
Type::overrideType('datetimetz', UTCDateTimeType::class);
// set time zone
if (!defined('_USER_TIMEZONE_')) {
if ($token != null && (($user = $token->getUser()) instanceof User) && $user->getTimezone()) {
define('_USER_TIMEZONE_', $user->getTimezone());
} else {
define('_USER_TIMEZONE_', 'UTC');
}
}
date_default_timezone_set(_USER_TIMEZONE_);
// get utc time zone offset
$now = new \DateTime();
$mins = $now->getOffset() / 60;
$sgn = ($mins < 0 ? -1 : 1);
$mins = abs($mins);
$hrs = floor($mins / 60);
$mins -= $hrs * 60;
$offset = sprintf('%+d:%02d', $hrs * $sgn, $mins);
$this->twig->addGlobal('TIMEZONE_UTC', $offset);
}
}
и services.yaml
config:
App\EventListener\TimezoneListener:
tags:
- { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }
Служба, которая обрабатывает событие, автоматически загружаемое самой Symfony.
И с этой конфигурацией у меня появляется следующая ошибка:
Unable to add global "TIMEZONE_UTC" as the runtime or the extensions have already been initialized.
Я вижу, что ветка инициируется в AppAuthAuthenticator :: onAuthenticationFailure, и когда TimezoneListener пытается добавить глобальную веточку var, это вызывает ошибку, и еслиЯ меняю приоритет с TimezoneListener
на 6, он не может обрабатывать часовой пояс (показать +00: 00)
Как правильно настроить эти два события?