Slim framework v4 - Добавьте глобалы в TwigView - PullRequest
1 голос
/ 14 октября 2019

В ходе тестирования мне не удалось добавить глобальные переменные в TwigView Slim v4. Раньше вы могли сделать это так:

$twigView->getEnvironment()->addGlobal('flash', $container->get('flash'));
$twigView->getEnvironment()->addGlobal('session', $_SESSION);

Но теперь возникает исключение: невозможно добавить глобальную 'flash', поскольку среда выполнения или расширения уже инициализированы.

Я взглянул на класс Environment Twig и нашел этот бит проверки:

 /**
 * Registers a Global.
 *
 * New globals can be added before compiling or rendering a template;
 * but after, you can only update existing globals.
 *
 * @param string $name  The global name
 * @param mixed  $value The global value
 */
public function addGlobal($name, $value)
{
    if ($this->extensionSet->isInitialized() && !array_key_exists($name, $this->getGlobals())) {
        throw new \LogicException(sprintf('Unable to add global "%s" as the runtime or the extensions have already been initialized.', $name));
    }

    if (null !== $this->resolvedGlobals) {
        $this->resolvedGlobals[$name] = $value;
    } else {
        $this->globals[$name] = $value;
    }
}

Может кто-нибудь объяснить мне, почему мы, кажется, выкидываем исключение, если глобальное НЕ СУЩЕСТВУЕТ, вместо этогоесли оно существует? Мне кажется, это логическая ошибка, но, возможно, я ее неправильно понимаю.

Заранее спасибо.

1 Ответ

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

Это не логическая ошибка.

Из DocBlock, который вы отправили со своим вопросом:

Новые глобалы могут быть добавлены до компиляции или рендеринга шаблона;но после этого вы можете только обновить существующие глобальные переменные.

Теперь взглянем на код:

if (
    // if the extension is initialized, the right side of && operator will be evaluated and...
    $this->extensionSet->isInitialized() &&
    // ...this means, we are only allowed to UPDATE a global,
    // so the global should already exist
    // and its lack of existence is an error, hence, if it does not exists, we throw an exception
    !array_key_exists($name, $this->getGlobals())

) {
    throw new \LogicException(sprintf('Unable to add global "%s" as the runtime or the extensions have already been initialized.', $name));
}

Текст ошибки в основном гласит:

Глобал с именем, на которое вы ссылаетесь , не существует , что означает, что это не обновление, а операция создания, и поскольку расширение уже инициализировано, вам не разрешено делать обновление.

...