¿Cómo hago para incluir la plantilla twig en un archivo separado?

Buenas tardes, escribo en esta oportunidad porque estoy utilizando el motor de plantilla twig en mi proyecto lo estoy trabajando en el patrón MVC, tengo un layout.html.twig en la carpeta default y los demás archivos en otras carpeta, pero me da el siguiente error:

Unable to find template "layout.html.twig" (looked into:
C:\xampp\htdocs\historial\views\usuario) in "index.html.twig" at line 1.

Cuando coloco el archivo layout.html.twig en la carpeta usuario me funciona bien pero no puedo tener ese archivo allí sino en la carpeta default/. Este es el código que estoy utilizando:

$directorio=ROOT . 'views' . DS . $this->_controlador . DS;
 
$rutaFile=$vista . '.html.twig';
 
$loader = new Twig_Loader_Filesystem($directorio);
 
$twig = new Twig_Environment($loader, array(
                'cache' => $this->cache_dir,
                'debug' => 'false'));
$template = $twig->loadTemplate($rutaFile);
 echo $template->render(array());

¿Qué puedo tener malo?

Respuestas

#1

Por motivos de seguridad, Twig no te deja incluir archivos que estén en algún directorio por encima del directorio raíz que has configurado para tus plantillas.

Por la forma de funcionar de tu código, le estás diciendo a Twig que busque las plantillas en usuario/, pero la plantilla layout.html.twig está en usuario/../default/ y por eso no funciona.

Lo que debes hacer es configurar el mismo directorio raíz para todas las plantillas y cambiar el nombre de cada plantilla. En vez de buscar la plantilla listar.html.twig en views/usuario/, puedes buscar la plantilla usuario/listar.html.twig en el directorio views/. Algo así:

$directorio = ROOT . 'views' . DS;
$rutaFile = $this->_controlador . DS $vista . '.html.twig';
 
$loader = new Twig_Loader_Filesystem($directorio);
 
$twig = new Twig_Environment($loader, array(
                'cache' => $this->cache_dir,
                'debug' => 'false'));
$template = $twig->loadTemplate($rutaFile);
echo $template->render(array());

Y en tus plantillas, no intentes extender de layout.html.twig sino de default/layout.html.twig

#2

Muchas gracias ahora si me funciona :)