Frage

Ich schrieb benutzerdefinierten Zweig Loader, die Vorlagen aus der Datenbank holen und es funktioniert in Twig „standalone“ Bibliothek. Jetzt möchte ich, dass in Symfony2 verwenden, aber nicht finden können, wo über Symfony2 Einstellungen Zweig Loader zu ändern.

Thx im Voraus für alle Tipps zu diesem

War es hilfreich?

Lösung

Hier finden Sie aktuelle diese Seite auf GitHub. Speziell <parameter key="twig.loader.class">Symfony\Bundle\TwigBundle\Loader\Loader</parameter>

Sie können diesen Schlüssel in Ihrer Konfiguration config.yml

Andere Tipps

Ihre eigenen Zweig loader Register + Twig_Loader_Chain sagt Laden mit Ihrem Lader zunächst zu versuchen. Sie können beliebig viele Lader auf Ihre Twig_Loader_Chain , wie Sie wollen.

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

Jetzt sollten Sie Ihren Lader erstellen. Twig Lader haben zu implementieren Twig_LoaderInterface .

Acme / CoreBundle / Zweig / Loader / Filesystem.php

Pseudo-Code:

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

    //...
}

Jetzt haben wir unsere Dienstleistungen definiert und ein neues Ladeprogramm erstellt. Das Problem ist, dass Zweig nicht über unsere neue Twig_Loader kennt und verwendet immer noch seine eigene -Default- „twig.loader“.

laufen auf CLI überprüfen:

app / console Container: debug twig.loader

Um Dienste außerhalb des eigenen Bündel zu ändern haben Sie CompilerPasses zu verwenden. Erstellen eigener dass Abtretungs Laders Dienst an der Zweig Umwelt:

Acme / CoreBundle / Dependency Injection / 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')));
    }
}

Es ist der „addMethodCall“ Ruf, der nichts anderes tut, als eine Setter-Injektion, wie in den Service-Definitionen definieren. Der Unterschied besteht darin, dass in einem Compiler übergeben Sie jeden Dienst zugreifen können, nicht nur Ihre eigenen ersetzt. Wie Sie die Kettenlader als der neue Lader für den Zweig-Umgebung definiert ist zu sehen.

Um dies zu erreichen Aufgabe, die Sie haben Symfony zu sagen, dass es diesen Compiler Pass verwenden soll. Compiler Ausweise können in Ihrem Paket enthalten Klasse hinzugefügt werden:

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

Wenn die entsprechende Datei nicht vorhanden ist Ihre neue Twig_Loader_Filesystem wirft einen Fehler und der Kettenlader weiterhin mit Standard-Zweig Loader als Fallback.

Um den Schlüssel in Ihrem config.yml überschreiben Sie sie unter Diensten tun müssen, nicht Zweig, wie es in der Konfiguration Parser zur Zeit unterstützen ist nicht (2.0.9)

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

services:
        twig.loader:
            class: Acme\CoreBundle\Twig\Loader\FilesystemLoader
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top