Come cambiare caricatore Ramoscello tramite le impostazioni di Symfony2
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
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