Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 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');
    }



}