无法添加全局树枝

Unable to add global twig

我有一个 AppAuthAuthenticator,在 onAuthenticationFailure 上我发送了一个事件:

if ($count === self::NOTIFY_ATTEMPTS) {
    $this->eventDispatcher->dispatch(new TooManyWrongLoginAttemptsEvent($user));
}

TooManyWrongLoginAttemptsEvent 中,我呈现(使用环境)电子邮件并将其发送到总线。

我有 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配置:

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.

我明白了,twig 在 AppAuthAuthenticator::onAuthenticationFailure 启动,当 TimezoneListener 尝试添加全局 twig var 时它会抛出错误,如果我将 TimezoneListener 的优先级更改为 6,它无法处理时区(显示 +00:00)

这两个事件如何配置正确?

为避免在添加全局变量时出现错误,您可以通过 Twig 配置定义一个默认值:

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