レンダリングを呼び出す前にtwigテンプレートが存在するかどうかを確認する方法はありますか?少なくともdev環境ではtry catchブロックが機能しないようです。例外。
このクラス TwigEngine にはexists()メソッドがありますが、使用例は見つかりませんでした。
twigエンジンを保持するサービスは、デフォルトとして構成されている場合は 'templating'です。
コントローラー内で次のことを行います。
if ( $this->get('templating')->exists('AcmeDemoBundle:Foo:bar.html.twig') ) {
// ...
}
別の方法は、render()メソッドが次のようにスローする例外をキャッチすることです。
try {
$this->get('templating')->render('AcmeDemoBundle:Foo:bar.html.twig')
} catch (\Exception $ex) {
// your conditional code here.
}
通常のコントローラーでは...
$this->render('...')
...のエイリアスのみです.
$this->container->get('templating')->renderResponse($view, $parameters, $response);
... while ...
$this->get('...')
...はのエイリアスです
$this->container->get('...')
templating
サービスは、将来のSymfonyバージョンで削除される予定です。 twig
サービスに基づく将来性のあるソリューションは次のとおりです。
if ($this->get('twig')->getLoader()->exists('AcmeDemoBundle:Foo:bar.html.twig')) {
// ...
}
twigテンプレート内からテンプレートの存在を確認する必要がある場合、 documentation で説明されているように、配列includeメソッドを使用する必要があります。
{% include ['page_detailed.html', 'page.html'] %}
オプションもあります:
{% include 'AcmeDemoBundle:Foo:bar.html.twig' ignore missing %}
足りない追加を無視することは、テンプレートが見つからない場合、単に何もしないようにtwigに伝えます。
依存性注入を使用して、この方法でそれを行うことができます。
use Symfony\Component\Templating\EngineInterface;
public function fooAction(EngineInterface $templeEngine)
{
if ($templeEngine->exists("@App/bar/foo.html.twig")) {
// ...
}
// ...
}
Symfony 3.4でテスト済み。