"Illegal offset type in isset or empty" 使用 Twig 宏时

"Illegal offset type in isset or empty" when using a Twig macro

使用 Grav v1.3.8(运行 on PHP 5.6.30),我目前遇到服务器错误("Illegal offset type in isset or empty") 尝试呈现使用宏的 Twig 模板时。

有趣的是,只有当我单独使用宏时才会出现这种情况。一旦我附加了一个过滤器,比如 trim,一切都会按预期进行。

(缩短的)宏文件,helpers.twig:

{% macro ascii(str) %}
{% spaceless %}
    {{ str|replace({
        'Á': 'A',
        'À': 'A',
        'Â': 'A',
        'Ã': 'A',
        ....
        'ƒ': 'f'
      })
    }}
{% endspaceless %}
{% endmacro ascii %}

模板(MCVE):

{% import 'macros/helpers.twig' as helpers %}

{% set img = helpers.ascii('günter-berger.jpg') %}
{% if page.media[img] is defined %}
    <img src="{{ page.media[img].url }}">
{% endif %}

这将产生错误。我将其缩小到 if 行。显然,宏工作正常,但如果输入未过滤的输出,条件将引发错误。添加任何过滤器,如 trimlower,将使其再次工作。

换句话说,这些工作:

但这会引发错误:

然而,尝试 the same thing on twigfiddle,所有三个似乎都在那里工作。
也许是 Grav 的问题?有人可以指出任何可能的原因吗?

我忘了这个,但是宏不是 return 字符串而是 return 一个 Twig_Markup

的实例
{% set test = macro.ascii('Ghünter.jpg') %}
{{ dump(test) }}

输出:object(Twig_Markup)#10679 (2) { ["content":protected]=> string(11) "Ghunter.jpg" ["charset":protected]=> string(5) "UTF-8" }

因为 return 类型是一个对象,您会收到此通知,因为您不能将对象用作 index。通过在此实例上使用过滤器,将调用 magic method __toString 方法,使其成为 return 字符串,从而使其可用作数组 [=] 的 index 19=]

唯一的办法就是绕过这个,写一个 filter 而不是 macro