Невозможно добавить глобальную веточку - PullRequest
0 голосов
/ 09 октября 2019

У меня есть 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)

Как правильно настроить эти два события?

1 Ответ

1 голос
/ 10 октября 2019

Чтобы избежать ошибки при добавлении глобальной переменной, вы можете определить значение по умолчанию через конфигурацию Twig:

# config/packages/twig.yaml
twig:
    globals:
        TIMEZONE_UTC: 0
...