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

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

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


person K. Weber    schedule 25.05.2013    source источник


Ответы (6)


Служба, содержащая движок ветки, если она настроена по умолчанию, является «шаблонной».

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

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);

... пока ...

$this->get('...') 

... это псевдоним для

$this->container->get('...')

Взгляните на Symfony\FrameworkBundle \Контроллер\Контроллер.

person Nicolai Fröhlich    schedule 25.05.2013
comment
Это больше не рекомендуемый ответ, пожалуйста, проверьте ответ Хавьера ниже. - person Anyone; 24.06.2019
comment
Это работает для Symfony 3.4.* $this->container->get('templating')->exists('@YourBundle/..Path../twigName.html.twig') если нет $this->container используйте вместо этого $this->getContainer()->.... - person ali6p; 24.09.2020

Служба templating будет удалена в будущих версиях Symfony. Перспективное решение на основе сервиса twig:

if ($this->get('twig')->getLoader()->exists('AcmeDemoBundle:Foo:bar.html.twig')) {
    // ...
}
person Javier Eguiluz    schedule 06.02.2017
comment
Есть ли у вас какие-либо ссылки в поддержку вашего заявления о том, что служба templating будет удалена в будущих версиях Symfony? - person dezlov; 17.05.2018
comment
Должно быть достаточно упоминаний о том, что Хавьер работает в SensioLabs ;) - person Nico Haase; 01.02.2019
comment
Объявление о прекращении использования шаблонов: symfony. ком/блог/ - person rrehbein; 03.06.2019

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

{% include ['page_detailed.html', 'page.html'] %}
person silzenna    schedule 12.01.2015
comment
Это очень удобно в конце шаблона. Может иметь пустой шаблон, чтобы безопасно ничего не делать, когда шаблона нет {% include ['page_detailed.html', 'page.html', 'empty-catch-all.html'] %} - person yuvilio; 22.04.2015
comment
Есть ли способ включить шаблон, если он еще не существует? - person Radhakrishna; 19.12.2016

Может еще вариант:

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

Игнорирование отсутствующего дополнения говорит twig просто ничего не делать, если шаблон не найден.

person Community    schedule 20.09.2016
comment
Я не могу представить ситуацию, в которой это было бы полезно, но все равно очень интересно знать об этом. - person aalaap; 27.12.2016
comment
это в случае динамически загружаемых шаблонов. Например, если вы хотите включить определенный шаблон с заданным именем, а этот шаблон с таким именем не существует, и вы не хотите, чтобы появилось 500, то это возможный вариант. - person ; 04.01.2017
comment
Спасибо - используя это для динамической загрузки шаблонов в соответствии с комментарием выше. - person Michael; 13.04.2017

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

use Symfony\Component\Templating\EngineInterface;

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

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

person Mateusz    schedule 18.01.2018
comment
как я видел с последним flex, вам не нужна ссылка @App, если шаблоны находятся в своем расположении по умолчанию, достаточно только относительного пути, т.е. у меня есть templates/Email/campaign.html.twig и @App/Email/campaign .html.twig не работает, работает только Email/campaign.html.twig - person Bizmate; 23.01.2019

Вы можете использовать внедрение зависимостей, чтобы получить среду, в которой хранится конфигурация Twig. Вот так (в контроллере):

/**
 * @Route("/{path}")
 */
public function index($path, Twig\Environment $env)
{
    if (!$env->getLoader()->exists('pages/'.$path.'.html.twig')) {
        return $this->render('pages/404.html.twig');
    }
}
person ghazaleh javaheri    schedule 17.10.2019