Domanda

ho scritto Twig personalizzata loader che recuperare i modelli dal database e funziona in Twig "stand-alone" libreria. Ora voglio usare che in Symfony2, ma non riesco a trovare dove cambiare Ramoscello loader tramite le impostazioni di Symfony2.

Thx in anticipo per eventuali suggerimenti su che

È stato utile?

Soluzione

Date un'occhiata al questa pagina a GitHub. Specialmente <parameter key="twig.loader.class">Symfony\Bundle\TwigBundle\Loader\Loader</parameter>

È possibile configurare questa chiave nella vostra config.yml

Altri suggerimenti

registrare il proprio ramoscello caricatore + dirà Twig_Loader_Chain per provare a caricare con il caricatore in un primo momento. È possibile creare e aggiungere il numero di caricatori per il tuo Twig_Loader_Chain come si desidera.

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] ]

Ora si dovrebbe creare il caricatore. pale Twig devono implementare Twig_LoaderInterface .

Acme / CoreBundle / Ramoscello / Loader / Filesystem.php

Pseudocodice:

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...
    }

    //...
}

Ora abbiamo definito i nostri servizi e ha creato una nuova pala. Il problema è che Ramoscello non conosce il nostro nuovo Twig_Loader e usa ancora il suo -default- "twig.loader".

Per controllare eseguito su CLI:

contenitore app / console: il debug twig.loader

Al fine di modificare i servizi al di fuori del proprio pacchetto è necessario utilizzare CompilerPasses. Creare la nostra che assegna il servizio loader per l'ambiente ramoscello:

Acme / CoreBundle / DependencyInjection / Compiler / 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')));
    }
}

Non è la chiamata "addMethodCall", che non fa altro che definire un'iniezione setter come nelle definizioni di servizio. La differenza è che in un compilatore passate è possibile accedere a tutti i servizi, non solo i vostri propri. Come si può vedere il loader a catena è stata definita come la nuova pala per l'ambiente ramoscello.

Per eseguire questa operazione è necessario dire a Symfony che dovrebbe utilizzare questo passaggio del compilatore. passaggi di compilazione possono essere aggiunti nella classe bundle:

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());
    }
}

Se il file corrispondente non esiste il nuovo Twig_Loader_Filesystem genera un errore e il caricatore a catena continua con predefinito ramoscello loader come fallback.

Per sovrascrivere la chiave nel vostro config.yml è necessario farlo sotto servizi non ramoscello in quanto non è contributo nel parser di configurazione al momento (2.0.9)

twig:
    cache:...
    debug:...
    ...

services:
        twig.loader:
            class: Acme\CoreBundle\Twig\Loader\FilesystemLoader
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top