我有点困惑。首先,看看我的代码,我猜。
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