我有点困惑。首先,我想看看我的代码。
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
我在尝试调用render方法之前检查了这个函数是否存在,而且它确实是未定义的。基本上,我在这里有2个问题:
问题1 它如何在我的项目的其他部分工作,但不是在这个特定的处理程序中?请参阅"重要更新"下方。
问题2 我可以用另一种方式解决我的问题吗?例如,不使用Sandbox或使用Sandbox使用某种标志" everythingAllowed = true"?
注意!重要更新 以前,我误解了自己的问题。我认为在渲染变量时抛出了错误,但我重新检查了这种情况(当Alain Tiemblo在评论中询问我的twig模板代码时),现在100%确定它在尝试翻译smth时被抛出。此外,我在我的项目中都有翻译,它工作正常,但在这种特定情况下它不是。我认为值得一提的是,我还试图在不使用Sandbox的情况下渲染模板。我试图像这样直接从Twig Engine渲染它
return $this->templating->render($layoutName, $data);
//$this->templating is injected in the constructor via services.yml like this
//arguments:
// - "@templating"
结果 - 没有正确翻译的文字。当我倾倒" locale" - 我有一种特定的语言,但文本被翻译成另一种语言。但至少使用这种方法 - 我没有得到任何错误..有人可以为我澄清这个吗?因为我真的不明白Intl / i18n扩展如何工作以及为什么它不想在Sandbox中工作或者不想在Sanbox中工作?
P.S。我的猜测,为什么它不直接从Twig Engine工作 - 可能我应该注入不像" @ templating"或者它注入正确,但Intl或I18n扩展没有启用?如何启用。而且我没有线索为什么它不适用于Sandbox