1

このレシピに基づいて、カスタム DatabaseTwigLoader を作成しました: http://twig.sensiolabs.org/doc/recipes.html#using-a-database-to-store-templates

それは正常に動作します。このローダーを使用して、DB から電子メール テンプレートを読み込み、それらをレンダリングし、迅速なメーラーを使用して送信しています。

問題は、テンプレートをレンダリングするときに、パスまたは url 小枝関数を使用できないことです。返されるエラーは次のとおりです。

関数「パス」が 6 行目の「NEW_POST_ON_YOUR_GOAL」に存在しません (500 内部サーバー エラー)

ただし、変数の補間とフィルターが適用され、テンプレートの継承が機能します。

URL / パス関数をカスタム ローダーに登録する必要がありますか? これらの機能がルーティングに依存していることと関係がありますか?

前もって感謝します。

** @MolecularMan によって提案されたソリューションの実装 **

ルーティング拡張機能を twigEnvironment に追加する必要がありました。これは TwigEnvironment::addExtension() メソッドを使用して行いました。

DI を使用してこれを実現するには、urlGenerator クラスを拡張する必要がありました (コンストラクター引数として routing_extension サービスに渡されます)。

UrlGenerator は、routeCollection オブジェクトをコンストラクター引数として受け取ります。そこで、routecollection を抽出して parent::__contruct() に渡すことができるように、ルーター サービスをコンストラクター引数として拡張 urlGenerator に渡します。

DI を使用してこれを実現するには、urlGenerator クラスを拡張する必要がありました (コンストラクター引数として routing_extension サービスに渡されます)。

UrlGenerator は、routeCollection オブジェクトをコンストラクター引数として受け取ります。そこで、routecollection を抽出して parent::__contruct() に渡すことができるように、ルーター サービスをコンストラクター引数として拡張 urlGenerator に渡します。

私の services.yml ファイルは次のようになります。

twig_db:
    class: %twig.class%
    arguments: [@twig_db_loader]
    calls: [[ addExtension, [@routing_extension] ]]
url_generator:
    class: ZT\UserBundle\Services\UrlGenerator
    arguments: [@router, @request_context, @logger]
request_context:
    class: Symfony\Component\Routing\RequestContext
routing_extension:
    class: Symfony\Bridge\Twig\Extension\RoutingExtension
    arguments: [@url_generator]
twig_db_loader:
    class: ZT\UserBundle\Services\DatabaseTwigLoader
    arguments: [@doctrine.orm.entity_manager]
4

1 に答える 1

0

RoutingExtension を登録する必要があります。

$loader = new \Twig_Loader_Filesystem(array(__DIR__ . '/../../Resources/views'));
$twig = new \Twig_Environment($loader);

$twig->addExtension(new RoutingExtension($this->getMock('Symfony\Component\Routing\Generator\UrlGeneratorInterface')));
$twig->render('your_view.html.twig');
于 2015-05-18T19:14:45.447 に答える