2013-05-25 4 views
29

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

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

ответ

60

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

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

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

Альтернативой будет ловить исключение рендеринга() метод генерирует так:

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\Controller\Controller.

16

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

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

Это очень удобно на конце шаблона. Может иметь пустой шаблон, чтобы безопасно ничего не делать, когда tempate не существует '' '{% include ['page_detailed.html', 'page.html', 'empty-catch-all.html']%}' '' – yuvilio

+0

Is есть способ включить шаблон, если он уже не существует? – Radhakrishna

+1

Imho это лучшее решение, спасибо – Prof83

5

Может быть также вариант:

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

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

+0

Я не могу представить ситуацию, когда это было бы полезно, но это все еще очень интересно узнать. – aalaap

+0

в случае динамически загружаемых шаблонов. Например, если вы хотите включить конкретный шаблон по указанному имени, и этот шаблон с этим именем не существует, и вы не хотите, чтобы 500 подошел, чем это возможно. – Sharpy35

+0

Спасибо - используя это для динамического загрузки шаблонов в соответствии с комментарием выше. – Michael

5

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

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

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

use Symfony\Component\Templating\EngineInterface; 

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

Испытано с Symfony 3.4.

Смежные вопросы