Cómo cambiar el cargador de la ramita través de la configuración de Symfony2

StackOverflow https://stackoverflow.com/questions/4682796

  •  10-10-2019
  •  | 
  •  

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

¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top