Hvordan endre Twig loader via Symfony2 innstillinger

stemmer
3

Jeg skrev tilpasset Twig laster som hente maler fra databasen og det fungerer i Twig frittstående bibliotek. Nå ønsker jeg å bruke det i Symfony2, men kan ikke finne hvor å endre Twig loader via Symfony2 innstillinger.

Thx på forhånd for alle tips om at

Publisert på 13/01/2011 klokken 16:57
kilden bruker
På andre språk...                            


3 svar

stemmer
9

Registrere ditt eget kvist loader + fortelle Twig_Loader_Chain å prøve lasting med lasteren først. Du kan opprette og legge til så mange lastere til Twig_Loader_Chain som du vil.

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

Nå bør du opprette din laster. Kvist lastere må gjennomføre Twig_LoaderInterface .

Acme / CoreBundle / Twig / Loader / Filesystem.php

pseudo~~POS=TRUNC:

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

    //...
}

Nå har vi definert våre tjenester og opprettet en ny loader. Problemet er at Twig ikke vet om vår nye Twig_Loader og fortsatt bruker sin egen -default- "twig.loader".

For å sjekke kjøre på CLI:

app / konsoll container: debug twig.loader

For å endre tjenester utenfor din egen pakke må du bruke CompilerPasses. Lage vår egen som tildeler lasteren tjenesten til kvist miljøet:

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

Det er "addMethodCall" samtale som ikke gjør noe mer enn å definere en setter injeksjon som i tjenestedefinisjoner. Forskjellen er at i en kompilator passerer du kan få tilgang til alle tjenester, ikke bare dine egne. Som du kan se motorslasteren er definert som den nye lasteren for kvist miljøet.

For å oppnå denne oppgaven du har å fortelle Symfony at den skal bruke denne kompilatoren pass. Kompilatoren passerer kan legges i bunt klasse:

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

Hvis den tilsvarende filen ikke finnes nye Twig_Loader_Filesystem kaster en feil og kjedet loader fortsetter med standard kvist loader som fallback.

Svarte 25/06/2014 kl. 14:31
kilden bruker

stemmer
3

Ta en titt på denne siden på GitHub. spesielt<parameter key="twig.loader.class">Symfony\Bundle\TwigBundle\Loader\Loader</parameter>

Du kan konfigurere denne nøkkelen i config.yml

Svarte 13/01/2011 kl. 19:17
kilden bruker

stemmer
1

Å overskrive nøkkelen i config.yml du trenger å gjøre det under tjenester ikke kvist som det ikke er støtte i konfigurasjonen parser i øyeblikket (2.0.9)

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

services:
        twig.loader:
            class: Acme\CoreBundle\Twig\Loader\FilesystemLoader
Svarte 09/01/2012 kl. 00:32
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more