Symfony2 では、レンダリングしようとすると、存在しないときindex.mobile.twig
にどのようにロードしますか。index.html.twig
index.mobile.twig
代わりに、「このテンプレートは存在しません」というエラーが表示されます。
答えは、Twig 用のカスタム ローダーを作成することのどこかにあると思いますが、それに関するドキュメントは見つかりませんでした。
答えはtwig.loader.class
、特定の小枝テンプレートが存在しないことが発見され、例外がスローされる前に、 を拡張して追加のステップを作成することです。
パート 1 - 構成
答えは、twig.loader.class
.
customloader.php
TwigFilesystemLoader
ファイルを拡張する を作成します。
namespace Acme\MyBundle\Twig\Loader;
use Symfony\Bundle\TwigBundle\Loader\FilesystemLoader;
class CustomLoader extends FilesystemLoader{}
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
コードがファイルの存在を認識した後、要求された形式であるかどうかを確認します。そうである場合は、テンプレート オブジェクトの形式を に設定しhtml
、name.html.twig
. この分野でできることはもっとたくさんありますが、これで私の問題は解決しました。
twig によってスローされた例外をキャッチして、他のテンプレートを使用して catch スコープで再試行できます。
テンプレートが存在しない場合、小枝は InvalidArgumentException をスローしますが、これが他のエラーでもスローされないかどうかはわかりません。
とにかく、次のようなことを試してください。
try {
$template = $this->render('index.mobile.twig');
} catch (\InvalidArgumentException $exc) {
$template = $this->render('index.html.twig');
}
return $template;