Twig在使用PHP 7.4时写变量出现问题

15

我在我的项目中使用php7.3,并在该项目中使用Twig。

升级我的php版本到7.4后,twig渲染出现了一些错误。

我通过Twig变量设置了一些html类。

例如:

<body class='{{global.direction}} preload {{bodyclass}}'></body>

使用PHP 7.3时,Twig渲染的输出为:

<body class='ltr preload main'></body>

我的代码没有问题。

但是当我的php升级到php 7.4后,输出结果发生了改变!

<body class='ltr preloadmain'></body>

我在代码中遇到了一个问题,当我使用 Twig 模板引擎调用变量时,它会把变量前的所有空格全部去掉,导致出现了错误。有没有什么解决方法?

有哪些修复方法?


1
我不明白为什么会删除空格,你确定在预加载类和 {{bodyclass}} 之间有空格吗? - Dylan KAS
我还制作了一个简单的测试用例,结果如预期。虽然我是从7.4开始的,没有升级。使用强大的最后手段命令"bin/console cache:clear"可能会有所帮助。 - Cerad
2
我在使用twig v1.18.2时遇到了同样的问题,升级到v1.42.4后问题得到了解决。https://github.com/twigphp/Twig/pull/3004/commits/1fb0f9701d8443083495cd2645e8a0c45d54c34d 似乎是修复的方法。 - Simo Heinonen
2
这让我付出了大量的搜索和工作来在Opencart中添加空格,我尝试更新Opencart Twig但没有任何发生,如果有人拥有Opencart Twig的更新,请发布为答案。 - Ahmad Odeh
5个回答

11
我所使用的通用答案(适用于Opencart Twig),与Simo Heinonen在评论中提到的修复有关,即: https://github.com/twigphp/Twig/pull/3004/commits/1fb0f9701d8443083495cd2645e8a0c45d54c34d 不同版本的代码与上面显示的略有不同。对于Opencart Twig(大多数版本,但测试了oc 3.0.3.3),似乎修复的方法是:
在文件Lexer.php中查找函数lexData的第163行,更改:
if (isset($this->positions[2][$this->position][0]) ) {
    $text = rtrim($text);
}

if (isset($this->positions[2][$this->position][0]) && ($this->options['whitespace_trim'] === $this->positions[2][$this->position][0])) {
   $text = rtrim($text);
}

1

Twig在PHP 7.4上存在问题。您可以更改PHP版本或升级到最新版本的Twig。


在你的代码注释中加入一个引用会是一个很好的补充。 - VisioN
1
@VisioN 这是唯一最简单的解决方案。我遇到了同样的问题,只需将 PHP 版本从 7.4 更改为 7.3 即可解决。 - jay padaliya
什么解决方案?如果你在你的回答中声称Twig与PHP 7.4有问题,你需要提供一个可以证明你说话的参考。否则,这更像是一条评论而不是一个答案。 - VisioN

0

我也遇到了同样的问题,使用Twig 1.x的旧项目没有更新选项。

到目前为止,我们已经通过在模板中插入必要的空格HTML代码来解决了这个问题。我的意思是:

<body class='{{global.direction}} preload &#32; {{bodyclass}}'></body>


0
我们刚刚发布了Craft 2.8.0版本,其中包含Twig 1.42.4版本,修复了一些PHP 7.4的问题。
请注意,此更新还将Craft的最低PHP要求提高到5.5。

-2

我在我的symfony项目中使用twig,但我无法重现您所描述的行为。

作为一个(丑陋的)解决方法,也许你可以改成:

<body class="{{ global.direction ~ ' preload ' ~ bodyclass }}"></body>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接