1

我有点困惑。首先,看看我的代码,我猜。

public function renderTemplate($templateType, $data)
{
    $layoutName = "$templateType.layout.html.twig";
    $policy = new \Twig_Sandbox_SecurityPolicy(
        ['if', 'for', 'block', 'set', 'extends'],
        ['escape', 'format', 'dateformat', 'trans', 'raw', 'striptags'],
        self::$allowedMethods,
        self::$allowedProperties,
        ['gettext']
    );
    $sandboxExt = new \Twig_Extension_Sandbox($policy);
    $intlExt = new \Twig_Extensions_Extension_Intl();
    $i18nExt = new \Twig_Extensions_Extension_I18n();
    $twig = new \Twig_Environment(new \Twig_Loader_Filesystem(__DIR__ . "/../Resources/views/Something/", "__main__"));
    $sandboxExt->enableSandbox();
    $twig->addExtension($sandboxExt);
    $twig->addExtension($intlExt);
    $twig->addExtension($i18nExt);
    try {
        $result = $twig->render($layoutName, $data);
    } catch (\Exception $e) {
        \Doctrine\Common\Util\Debug::dump($e);die();
    }

    return $result;
}

这是我要渲染的模板

{% extends 'layout.html.twig' %}

{% block title %}{{ entity.id }}{% endblock %}
{% block bodyTitle %}
    {{ entity.id }} {{ 'translation_key.created_at'|trans({}, 'entities', locale) }} {{ entity.createdAt|dateformat(null, locale) }}
{% endblock %}

在这里,如您所见,我想根据模板的类型来渲染模板。问题是:一半的模板渲染得很好,然后,当它尝试渲染翻译后的字符串时,它会抛出一个错误。

Fatal error: Call to undefined function gettext() in /home/dev/vhosts/my-project/vendor/twig/twig/lib/Twig/Environment.php(403) : eval()'d code on line 69

我在尝试调用渲染方法之前检查了这个函数是否存在,它确实是未定义的。基本上,我在这里有两个问题:

问题 1 它在我的项目的其他部分是如何工作的,但在这个特定的处理程序中却不是?请参阅下面的“重要更新”。

问题 2 我可以通过其他方式解决我的问题吗?例如,不使用沙盒或使用带有某种标志“everythingAllowed=true”的沙盒?

注意力!重要更新 以前,我误解了自己的问题。我以为是在渲染变量时抛出了错误,但我重新检查了情况(当 Alain Tiemblo 在评论中询问我这里的树枝模板代码时),现在 100% 确定它是在尝试翻译时抛出的。另外,我的项目中到处都有翻译,而且效果很好,但在这种特定情况下却不是。我认为值得一提的是,我还尝试在不使用沙盒的情况下渲染模板。我试图像这样直接从 Twig Engine 渲染它

return $this->templating->render($layoutName, $data);
//$this->templating is injected in the constructor via services.yml like this
//arguments:
//  - "@templating"

结果 - 没有正确翻译文本。当我转储“语言环境”时 - 我得到了一种特定的语言,但文本被翻译成另一种语言。但至少使用这种方法 - 我没有收到任何错误..有人可以为我澄清一下吗?因为我真的不明白 Intl/i18n 扩展是如何工作的,为什么它不想在 Sandbox 中工作或不在 Sanbox 中工作?

PS 我的猜测,为什么它不能直接从 Twig Engine 工作 - 可能我不应该像“@templating”那样注入或者它注入恰到好处,但是没有启用 Intl 或 I18n 扩展?如何启用。而且我不知道为什么它不适用于 Sandbox

4

0 回答 0