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

render メソッドを呼び出そうとする直前に、この関数が存在するかどうかを確認しましたが、実際には未定義でした。基本的に、ここに 2 つの質問があります。

質問 1 プロジェクトの他の部分ではどのように機能しますが、この特定のハンドラーでは機能しませんか? 以下の「重要な更新」を参照してください。

質問 2 別の方法で問題を解決できますか? たとえば、サンドボックスを使用せずに、または何らかのフラグ「everythingAllowed=true」を指定してサンドボックスを使用しますか?

注意!重要な更新 以前、私は自分の質問を誤解していました。変数のレンダリング中にエラーがスローされたと思いましたが、状況を再確認しました (Alain Tiemblo がコメントで小枝テンプレート コードをここに要求したとき)。また、プロジェクト全体に翻訳があり、問題なく動作しますが、この特定の状況ではそうではありません。サンドボックスを使用せずにテンプレートをレンダリングしようとしたことも言及する価値があると思います。このように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