Načítání Twig šablon z dalšího adresáře [symfony]

posted 25.08.2014

Pokud je potřeba načítat šablony ze sdíleného umístění mimo aplikaci, lze zaregistrovat další loader to Twigu, který bude nastavený na jejich umístění.

Twig používá standardně jeden Loader, pro podporu více zdrojů je potřeba použít obalující Twig_Loader_Chain. Výchozí Loader, pracující se šablonami v app/ a v Bundle adresářích je v kontejneru zaregistrovaný jako twig.loader. Pro naše účely stačí nakonfigurovat instanci Twig_Loader_Filesystem a ten s původním zabalit do wrapperu.

symfony_blog.twig.loader.custom:
    class: Twig_Loader_Filesystem
    arguments: [ %custom_template_path% ]
    tags:
        - { name: templating.loader }

symfony_blog.twig.loader.chain:
    class: Twig_Loader_Chain
    calls:
        - [ addLoader, [@symfony_blog.twig.loader.custom] ]
        - [ addLoader, [@twig.loader] ]

Navíc je potřeba změnit u výchozí Twig služby loader. To není možné přes YAML, je potřeba zaregistrovat průchod kompilátoru kontejneru.

<?php

use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;

class CustomLoaderPass implements CompilerPassInterface
{
    public function process(ContainerBuilder $container)
    {
        $definition = $container->getDefinition('twig');
        $definition->addMethodCall('setLoader', [new Reference('symfony_blog.twig.loader.custom')]);
    }
}

Nově vytvořený průchod se bude volat, pokud ho zaregistrujeme v Bundle třídě.

<?php

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\HttpKernel\Bundle\Bundle;

class ExampleBundle extends Bundle
{

    public function build(ContainerBuilder $container)
    {
        parent::build($container);
        $container->addCompilerPass(new CustomLoaderPass());
    }

}