3

Symfony2 では、レンダリングしようとすると、存在しないときindex.mobile.twigどのようにロードしますか。index.html.twigindex.mobile.twig代わりに、「このテンプレートは存在しません」というエラーが表示されます。

答えは、Twig 用のカスタム ローダーを作成することのどこかにあると思いますが、それに関するドキュメントは見つかりませんでした。

4

2 に答える 2

2

答えはtwig.loader.class、特定の小枝テンプレートが存在しないことが発見され、例外がスローされる前に、 を拡張して追加のステップを作成することです。

パート 1 - 構成

答えは、twig.loader.class.

  1. customloader.phpTwigFilesystemLoaderファイルを拡張する を作成します。

    namespace Acme\MyBundle\Twig\Loader;       
    use Symfony\Bundle\TwigBundle\Loader\FilesystemLoader;
    class CustomLoader extends FilesystemLoader{}
    
  2. config.yml以下を含めるように変更します。

パラメーター:
     twig.loader.class: Acme\YourBundle\Twig\Loader\name_of_your_class

パート 2 - クラスの拡張

クラスの拡張はかなり簡単です..私が変更する必要があったメソッドはfindTemplate($template). これは非常に小さなメソッドであり、おそらく元のコードをより適切に拡張するために使用できます。しかし、私はそれを完全に上書きし、エラーparent::の直前に次のコードを含めることにしました:Unable to find template

    if (false === $file || null === $file) {

        switch( $template->get('format')){
            case 'mobile':
                    $template->set('format','html');
                    return self::findTemplate($template->getLogicalName());
                break;
        }

        throw new \Twig_Error_Loader(sprintf('Unable to find template "%s".', $logicalName), -1, null, $previous);

mobileコードがファイルの存在を認識した後、要求された形式であるかどうかを確認します。そうである場合は、テンプレート オブジェクトの形式を に設定しhtmlname.html.twig. この分野でできることはもっとたくさんありますが、これで私の問題は解決しました。

于 2012-09-24T16:43:11.307 に答える
1

twig によってスローされた例外をキャッチして、他のテンプレートを使用して catch スコープで再試行できます。

テンプレートが存在しない場合、小枝は InvalidArgumentException をスローしますが、これが他のエラーでもスローされないかどうかはわかりません。

とにかく、次のようなことを試してください。

try {
    $template = $this->render('index.mobile.twig');
} catch (\InvalidArgumentException $exc) {
    $template = $this->render('index.html.twig');
}
return $template;
于 2012-09-21T14:53:10.297 に答える