7

ネイティブローダーを使用して標準のファイルシステムの場所にテンプレートをレンダリングする可能性を維持しながら、Symfony2アプリケーションのデータベースから特定のTwigテンプレートをロードしたいと思います。これを達成する方法は?

私が理解している限り、Twig環境に複数のローダーを登録する可能性はありません。私は(今のところ)2つの方法を考えてきました:

  • デフォルトのローダーをカスタムプロキシクラスに置き換えます。テンプレートが標準の@Bundle-notationで参照される場合、プロキシはリクエストをデフォルトのローダーに渡します。それ以外の場合、リクエストはカスタム(データベース)ローダーに渡されます。また
  • 完全に新しいTwig環境を構築します。この方法では、カスタムTwig拡張機能を両方の環境に登録する必要があり、異なるソース(@Bundlesからのもの、データベースからのもの)からのテンプレートを相互参照することはできません。

アップデート1:

Twigは、私の最初のオプションで使用できるTwig_Loader_Chainクラスをサポートしているようです。それでも、デフォルトのローダーにアクセスして、最初のオプションとしてチェーンに渡す必要があります。

4

2 に答える 2

6

Twig_Loader_Chainを使用するには、Symfony 2.2が必要です https://github.com/symfony/symfony/pull/6131
次に、ローダーを簡単に構成できます。

services:
    twig.loader.filesystem:
        class: %twig.loader.filesystem.class%
        arguments:
            - @templating.locator
            - @templating.name_parser
        tags:
            - { name: twig.loader }
    twig.loader.string:
        class: %twig.loader.string.class%
        tags:
            - { name: twig.loader }

更新:
まだいくつかの問題があるようです(ファイルシステムローダーがテンプレートを見つけることができない場合があります)が、私はこれを見つけました:http://forum.symfony-project.org/viewtopic.php?t=40382&p
=

131254うまくいっています!

于 2013-03-26T16:25:47.977 に答える
2

これは、標準環境でローダーを一時的に変更するための安価で陽気な方法です。

    // Keep the current loader
    $oldLoader = $env->getLoader();

    // Temporarily set a string loader   
    $env->setLoader(new \Twig_Loader_String());

    // Resolve the template - but don't render it yet.
    $template = $env->resolveTemplate($template);

    // Restore the old loader
    $env->setLoader($oldLoader);

    // Render the template. This will pass the old loader into any subtemplates and make sure your string based template gets into the cache.
    $result = $template->render($context);

これは他のカスタムローダーでも機能すると思います。

于 2014-06-18T23:07:26.540 に答える