Проблема с обновлением глобальных переменных веток - PullRequest
0 голосов
/ 08 января 2019

Здравствуйте. Я довольно новичок в разработке с PHP и Twig и столкнулся с проблемой при обновлении глобальных переменных в twig. Хотя было бы неплохо иметь глобальную переменную flash / message, которую я мог бы отображать пользователю, если он ввел неправильный ввод (например, экран входа в систему).

В данный момент я использую сессию в php для этого флеш-сообщения. Когда флэш-сообщение обновляется, оно также должно обновляться в Twig. Но он не обновляется, пока я не перезагрузить страницу. В этот момент флэш-сообщение может быть изменено. Я думал, что проблема, возможно, была в PHP, поэтому я отобразил переменную flash в моем коде до того, как шаблон Twig был визуализирован, и переменная flash была обновлена ​​в этом соответствующем операторе echo. Я хочу подчеркнуть, что Twig действительно обновляет флэш-сообщение, но это происходит только после повторной загрузки страницы. Так что у него никогда нет текущего флеш-сообщения.

Я написал короткую программу, чтобы продемонстрировать это. Если пользователь нажимает кнопку «один», то флэш-сообщение должно быть «сообщение один», а если он нажимает кнопку «два», то флэш-сообщение должно быть «сообщение два». Я включил как эхо флеш-сообщения в php, так и флеш-сообщение в шаблоне Twig.

index.php

<?php
session_start();

require_once '../PhotoBlog/utilities/twig/vendor/autoload.php';

$loader = new Twig_Loader_Filesystem('view');
$twig = new Twig_Environment($loader, array('cache' => false));
$twig->addGlobal('session', $_SESSION);

if (isset($_GET["test_one"])) {
    $_SESSION["flash"] = "message one";
}else if(isset($_GET["test_two"])) {
    $_SESSION["flash"] = "message two";
}
echo "PHP says: ".$_SESSION["flash"]."<br><br>";

echo $twig->render('index.html');


?>

index.html

<form action="index.php" method="GET">
    <input type="submit" name="test_one" value="one">
    <input type="submit" name="test_two" value="two">
</form>

<p>Twig says: {{ session.flash }}</p>

В идеале сообщения должны соответствовать друг другу, но сообщение Twig всегда печатает предыдущее сообщение.

Но Twig всегда будет выводить от второго до последнего представления. Я не могу думать об этом. Я просмотрел документы Twig и stackoverflow и не нашел никаких решений. Я отключил кеширование, так что, думаю, я исключил это, но, может быть, я что-то здесь упускаю.

1 Ответ

0 голосов
/ 08 января 2019

Массивы по умолчанию передаются в PHP, если в сигнатуре метода не указано иное (function addGlobal($key, $value) против function addGlobal($key, &$value) {}).

Если вы действительно хотите обновить флэш-сообщения, вам нужно переключиться на объект, чтобы решить эту проблему.

<?php

class Foo {
    protected $array = [];

    public function addGlobal($key, $value) {
        $this->array[$key] = $value;
        return $this;
    }

    public function getGlobal($key) {
        return $this->array[$key] ?? null;
    }
}

class Bar {
    protected $value;

    public function setValue($value) {
        $this->value = $value;
        return $this;
    }

    public function getValue() {
        return $this->value;
    }
}

$foo = new Foo();
$bar = new Bar();

$bar->setValue('foobar');
$array = [ 'bar' => 'foobar', ];

$foo->addGlobal('array', $array);
$foo->addGlobal('object', $bar);

$array['bar'] = 'bar';
$bar->setValue('bar');

var_dump($foo->getGlobal('object')->getValue()); /** Output: bar **/
var_dump($foo->getGlobal('array')['bar']); /** Output: foobar **/

демо

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