Проверьте, существует ли шаблон перед рендерингом

Есть ли способ проверить, существует ли шаблон ветки до вызова рендера? Кажется, что блок catch try не работает, по крайней мере, в среде dev, и, кроме того, я предпочитаю проверку, чем стоимость исключения.

Этот класс TwigEngine имеет метод exists(), но не нашел примеров использования.

Ответ 1

Служба, содержащая двигатель ветки, если настроена по умолчанию, является "templating".

Внутри вашего контроллера выполните следующие действия:

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

Альтернативой было бы исключение catch, которое делает метод 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.

Ответ 2

Служба templating будет удалена в будущих версиях Symfony. Будущим решением, основанным на сервисе twig, является:

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

Ответ 3

Если вам нужно проверить наличие шаблона из внутренних шаблонов, вам нужно использовать методы массива include, как описано в документации:

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

Ответ 4

Возможно также вариант:

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

Недопустимое добавление игнорирования говорит веточку просто ничего не делать, когда шаблон не найден.

Ответ 5

Вы можете сделать это, используя внедрение зависимостей:

use Symfony\Component\Templating\EngineInterface;

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

Протестировано с Symfony 3.4.

Ответ 6

как @javier-eguiluz вы можете использовать внедрение зависимостей, получить Среду, в которой хранится конфигурация Twig. как это

  /**
 * @Route("/{path}",requirements={"path": "^(?!.*(api|media|cache|resolve|docs)).*$"}, methods={"GET"}, name="Home")
 * @param Request $request
 * @param $path
 * @return \Symfony\Component\HttpFoundation\Response
 */
public function index(Request $request,$path,Environment $engine)
{

    if (!$engine->getLoader()->exists('pages/'.$path.'.html.twig')){
        return $this->render('pages/404.html.twig');
    }



}