【问题标题】:Issue with updating twig global variables更新树枝全局变量的问题
【发布时间】:2019-01-08 02:39:42
【问题描述】:

您好,我是使用 PHP 和 Twig 开发的新手,在更新 twig 中的全局变量时遇到了问题。我认为如果用户输入了错误的输入(例如登录屏幕),我可以向用户显示一个闪存/错误消息全局变量会很好。

目前我正在使用 php 中的会话来获取此 Flash 消息。当 flash 消息更新时,它也应该在 Twig 中更新。但在我重新加载页面之前它不会更新。此时,可能会更改闪存消息。我认为问题可能出在 PHP 中,因此在呈现 Twig 模板之前,我在代码中回显了 flash 变量,并在相应的 echo 语句中更新了 flash 变量。我想强调的是,Twig 确实会更新 flash 消息,但直到页面再次加载后才会更新。所以它永远不会有当前的 flash 消息。

我编写了一个简短的程序来演示这一点。如果用户按下按钮“一”,则闪存消息应该是“消息一”,如果他们按下按钮“二”,则闪存消息应该是“消息二”。我在 php 中包含了 flash 消息的 echo 和 Twig 模板中的 flash 消息。

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 并没有找到任何解决方案。我关闭了缓存,所以我想我已经排除了这种可能性,但也许我在这里遗漏了一些东西。

【问题讨论】:

    标签: php twig


    【解决方案1】:

    默认情况下,数组在 PHP 中按值传递,除非方法签名中另有说明(function addGlobal($key, $value)function addGlobal($key, &amp;$value) {})。

    如果你真的想更新 flash 消息,你需要切换到一个对象来解决这个问题。

    <?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 **/
    

    demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-14
      • 1970-01-01
      • 1970-01-01
      • 2016-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多