web-dev-qa-db-ja.com

レンダリングする前にテンプレートが存在するかどうかを確認します

レンダリングを呼び出す前にtwigテンプレートが存在するかどうかを確認する方法はありますか?少なくともdev環境ではtry catchブロックが機能しないようです。例外。

このクラス TwigEngine にはexists()メソッドがありますが、使用例は見つかりませんでした。

35
K. Weber

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('...')

Symfony\FrameworkBundle\Controller\Controller をご覧ください。

65

templatingサービスは、将来のSymfonyバージョンで削除される予定です。 twigサービスに基づく将来性のあるソリューションは次のとおりです。

if ($this->get('twig')->getLoader()->exists('AcmeDemoBundle:Foo:bar.html.twig')) {
    // ...
}
20
Javier Eguiluz

twigテンプレート内からテンプレートの存在を確認する必要がある場合、 documentation で説明されているように、配列includeメソッドを使用する必要があります。

{% include ['page_detailed.html', 'page.html'] %}
19
silzenna

オプションもあります:

{% include 'AcmeDemoBundle:Foo:bar.html.twig' ignore missing %}

足りない追加を無視することは、テンプレートが見つからない場合、単に何もしないようにtwigに伝えます。

10
user3676604

依存性注入を使用して、この方法でそれを行うことができます。

use Symfony\Component\Templating\EngineInterface;

public function fooAction(EngineInterface $templeEngine)
{
    if ($templeEngine->exists("@App/bar/foo.html.twig")) {
        // ...
    }
    // ...
}

Symfony 3.4でテスト済み。

0
Mateusz