使用沙盒安全策略

时间:2016-05-13 15:05:19

标签: symfony internationalization twig twig-extension

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

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

0 个答案:

没有答案