Проверьте, существует ли шаблон перед рендерингом
Есть ли способ проверить, существует ли шаблон ветки до вызова рендера? Кажется, что блок 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');
}
}