Twig GlobalsInterface ломает панель инструментов отладки Symfony - PullRequest
0 голосов
/ 13 июня 2019

Symfony 4.3.1

У меня есть Twig-расширение, в которое я добавляю переменные глобально в Twig. Как только я внедряю Twig\Extension\GlobalsInterface в своем классе, панель инструментов отладки Symfony просто отображает «Ошибка при загрузке панели инструментов веб-отладки». Переменные прекрасно добавляются в глобальную область видимости.

Вот мое расширение:

<?php

namespace App\Twig;

use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Doctrine\ORM\EntityManagerInterface;
use Twig\Extension\AbstractExtension;
use Twig\Extension\GlobalsInterface;

class GlobalVarsExtension extends AbstractExtension implements GlobalsInterface
{
    protected $em;

    protected $tokenStorage;

    protected $authorizationChecker;

    public function __construct(EntityManagerInterface $em, AuthorizationCheckerInterface $authorizationChecker, TokenStorageInterface $tokenStorage)
    {
        $this->em = $em;
        $this->tokenStorage = $tokenStorage;
        $this->authorizationChecker = $authorizationChecker;
    }


    public function getGlobals()
    {
        $globalVars = [];

        if ($this->authorizationChecker->isGranted('IS_AUTHENTICATED_FULLY')) {
            if (null !== $token = $this->tokenStorage->getToken()) {
                $globalVars['user'] = $token->getUser();
            }
        }

        return $globalVars;
    }
}

Это интерфейс, который я реализую:

<?php

/*
 * This file is part of Twig.
 *
 * (c) Fabien Potencier
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Twig\Extension;

/**
 * Enables usage of the deprecated Twig\Extension\AbstractExtension::getGlobals() method.
 *
 * Explicitly implement this interface if you really need to implement the
 * deprecated getGlobals() method in your extensions.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
interface GlobalsInterface
{
    /**
     * Returns a list of global variables to add to the existing list.
     *
     * @return array An array of global variables
     */
    public function getGlobals();
}

class_alias('Twig\Extension\GlobalsInterface', 'Twig_Extension_GlobalsInterface');

Я следовал их документации для добавления глобальных переменных: https://twig.symfony.com/doc/2.x/advanced.html#id1

Вот список изменений из Twig, где указано, что метод устарел: https://twig.symfony.com/doc/1.x/deprecated.html#extensions

Чего мне не хватает? Или есть другой подход к добавлению глобальных переменных?

Edit:

После осознания того, что я полностью пропустил журнал ошибок Symfony и ошибка появляется по совершенно другой причине ...

Errorlog:

[2019-06-13 15:49:18] request.CRITICAL: Uncaught PHP Exception Symfony\Component\Security\Core\Exception\AuthenticationCredentialsNotFoundException: "The token storage contains no authentication token. One possible reason may be that there is no firewall configured for this URL." at /var/www/rekkt.de/vendor/symfony/security-core/Authorization/AuthorizationChecker.php line 49 {"exception":"[object] (Symfony\\Component\\Security\\Core\\Exception\\AuthenticationCredentialsNotFoundException(code: 0): The token storage contains no authentication token. One possible reason may be that there is no firewall configured for this URL. at /var/www/rekkt.de/vendor/symfony/security-core/Authorization/AuthorizationChecker.php:49)"} []
[2019-06-13 15:49:18] request.CRITICAL: Exception thrown when handling an exception (Symfony\Component\Security\Core\Exception\AuthenticationCredentialsNotFoundException: The token storage contains no authentication token. One possible reason may be that there is no firewall configured for this URL. at /var/www/rekkt.de/vendor/symfony/security-core/Authorization/AuthorizationChecker.php line 49) {"exception":"[object] (Symfony\\Component\\Security\\Core\\Exception\\AuthenticationCredentialsNotFoundException(code: 0): The token storage contains no authentication token. One possible reason may be that there is no firewall configured for this URL. at /var/www/rekkt.de/vendor/symfony/security-core/Authorization/AuthorizationChecker.php:49)"} []
[2019-06-13 15:49:18] php.CRITICAL: Uncaught Exception: The token storage contains no authentication token. One possible reason may be that there is no firewall configured for this URL. {"exception":"[object] (Symfony\\Component\\Security\\Core\\Exception\\AuthenticationCredentialsNotFoundException(code: 0): The token storage contains no authentication token. One possible reason may be that there is no firewall configured for this URL. at /var/www/rekkt.de/vendor/symfony/security-core/Authorization/AuthorizationChecker.php:49, Symfony\\Component\\Security\\Core\\Exception\\AuthenticationCredentialsNotFoundException(code: 0): The token storage contains no authentication token. One possible reason may be that there is no firewall configured for this URL. at /var/www/rekkt.de/vendor/symfony/security-core/Authorization/AuthorizationChecker.php:49)"} []
[2019-06-13 15:49:18] request.CRITICAL: Uncaught PHP Exception Symfony\Component\Security\Core\Exception\AuthenticationCredentialsNotFoundException: "The token storage contains no authentication token. One possible reason may be that there is no firewall configured for this URL." at /var/www/rekkt.de/vendor/symfony/security-core/Authorization/AuthorizationChecker.php line 49 {"exception":"[object] (Symfony\\Component\\Security\\Core\\Exception\\AuthenticationCredentialsNotFoundException(code: 0): The token storage contains no authentication token. One possible reason may be that there is no firewall configured for this URL. at /var/www/rekkt.de/vendor/symfony/security-core/Authorization/AuthorizationChecker.php:49, Symfony\\Component\\Security\\Core\\Exception\\AuthenticationCredentialsNotFoundException(code: 0): The token storage contains no authentication token. One possible reason may be that there is no firewall configured for this URL. at /var/www/rekkt.de/vendor/symfony/security-core/Authorization/AuthorizationChecker.php:49)"} []
[2019-06-13 15:49:18] request.CRITICAL: Exception thrown when handling an exception (Symfony\Component\Security\Core\Exception\AuthenticationCredentialsNotFoundException: The token storage contains no authentication token. One possible reason may be that there is no firewall configured for this URL. at /var/www/rekkt.de/vendor/symfony/security-core/Authorization/AuthorizationChecker.php line 49) {"exception":"[object] (Symfony\\Component\\Security\\Core\\Exception\\AuthenticationCredentialsNotFoundException(code: 0): The token storage contains no authentication token. One possible reason may be that there is no firewall configured for this URL. at /var/www/rekkt.de/vendor/symfony/security-core/Authorization/AuthorizationChecker.php:49)"} []

Edit2:

Итак, с учетом данного журнала ошибок это то, что я изменил, и теперь оно работает хорошо.

public function getGlobals()
    {
        $globalVars = [];

        if (null !== $token = $this->tokenStorage->getToken()) {
            $globalVars['user'] = $token->getUser();
        }

        return $globalVars;
    }

1 Ответ

1 голос
/ 13 июня 2019

Прежде всего, вы не должны вставлять весь контейнер в ваше расширение.

Всегда старайтесь вводить только то, что вам нужно. В вашем примере вы можете ввести непосредственно AuthorizationCheckerInterface вместо ContainerInterface.

Что касается вашей ошибки, без журналов немного обидно догадаться, но вы должны попытаться проверить, не возвращает ли getToken() метод null, прежде чем вызывать getUser().

<?php

namespace App\Twig;

use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Doctrine\ORM\EntityManagerInterface;
use Twig\Extension\AbstractExtension;
use Twig\Extension\GlobalsInterface;
use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;


class GlobalVarsExtension extends AbstractExtension implements GlobalsInterface
{
    protected $em;

    protected $tokenStorage;

    protected $authorizationChecker;

    public function __construct(EntityManagerInterface $em, AuthorizationCheckerInterface $authorizationChecker, TokenStorageInterface $tokenStorage)
    {
        $this->em = $em;
        $this->tokenStorage = $tokenStorage;
        $this->authorizationChecker = $authorizationChecker;
    }


   public function getGlobals()
   {
    $globalVars = [];

    if ($this->authorizationChecker->isGranted('IS_AUTHENTICATED_FULLY')) {
        if (null !== $token = $this->tokenStorage->getToken()) {
            $globalVars['user'] = $token->getUser();
        }
    }

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