Cómo cambiar el cargador de la ramita través de la configuración de Symfony2
Pregunta
Me escribió encargo de la ramita cargador que buscar a las plantillas de base de datos y funciona en la ramita biblioteca "independiente". Ahora quiero usar que en Symfony2 pero no puedo encontrar dónde cambiar la ramita cargador través de la configuración de Symfony2.
Thx de antemano por algún consejo sobre que
Solución
Para consultar esta página en GitHub. Especialmente <parameter key="twig.loader.class">Symfony\Bundle\TwigBundle\Loader\Loader</parameter>
Se puede configurar esta clave en su config.yml
Otros consejos
Registre su propio cargador + ramita decir Twig_Loader_Chain para tratar la carga con su cargador en un principio. Se pueden crear y añadir tantos cargadores a su Twig_Loader_Chain como desee.
services:
Acme.corebundle.twig.loader.filesystem:
class: Acme\CoreBundle\Twig\Loader\Filesystem
tags:
- { name: templating.loader }
Acme.corebundle.twig_chain_loader:
class: Twig_Loader_Chain
calls:
- [ addLoader, [@Acme.corebundle.twig.loader.filesystem] ]
- [ addLoader, [@twig.loader] ]
Ahora debe crear su cargador. cargadores ramita tienen que implementar Twig_LoaderInterface .
Acme / CoreBundle / Ramita / cargador / Filesystem.php
pseudocódigo:
namespace Acme\CoreBundle\Twig\Loader;
use Twig_LoaderInterface;
class Filesystem implements Twig_LoaderInterface {
/**
* {@inheritdoc}
*/
public function getSource($name)
{
//code...
}
/**
* {@inheritdoc}
*/
protected function findTemplate($name)
{
//code...
}
/**
* {@inheritdoc}
*/
public function isFresh($template, $time)
{
//code...
}
//...
}
Ahora hemos definido nuestros servicios y ha creado un nuevo cargador. El problema es que la ramita no sabe nada de nuestro nuevo Twig_Loader y todavía utiliza su propio -Default- "twig.loader".
Para comprobar ejecuta en la CLI:
contenedor de aplicación / consola: depuración twig.loader
Con el fin de modificar los servicios fuera de su propio paquete tiene que usar CompilerPasses. Crear nuestra propia que asigna el servicio de cargador para el medio ambiente ramita:
Acme / CoreBundle / DependencyInjection / Compilador / TwigFileLoaderPass.php
<?php
namespace Acme\CoreBundle\DependencyInjection\Compiler;
use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
class TwigFileLoaderPass implements CompilerPassInterface
{
public function process(ContainerBuilder $container)
{
$definition = $container->getDefinition('twig');
$definition->addMethodCall('setLoader', array(new Reference('Acme.corebundle.twig_chain_loader')));
}
}
No es la llamada "addMethodCall" que no hace nada más que definir una inyección de setter como en las definiciones de servicio. La diferencia es que en un compilador pasa se puede acceder a todos los servicios, no sólo los suyos propios. Como se puede ver el gestor de encadenamiento se ha definido como el nuevo cargador para el medio ambiente ramita.
Para realizar esta tarea que tiene que decir a Symfony que debería utilizar este pase compilador. pases compilador puede añadirse en su clase de paquete:
Acme / CoreBundle / AcmeCoreBundle.php
<?php
namespace Acme\CoreBundle;
use Symfony\Component\HttpKernel\Bundle\Bundle;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Acme\CoreBundle\DependencyInjection\Compiler\TwigFileLoaderPass;
class AcmeCoreBundle extends Bundle
{
public function build(ContainerBuilder $container)
{
parent::build($container);
$container->addCompilerPass(new TwigFileLoaderPass());
}
}
Si no existe el archivo correspondiente a su nueva Twig_Loader_Filesystem lanza un error y el gestor de encadenamiento continúa con la ramita por defecto como cargador de reserva.
Para sobrescribir la clave en su config.yml que hay que hacer en los términos de servicios no ramita y cuando no se admite en el analizador de configuración en el momento (2.0.9)
twig:
cache:...
debug:...
...
services:
twig.loader:
class: Acme\CoreBundle\Twig\Loader\FilesystemLoader