Question

J'ai écrit chargeur Brindille personnalisé modèles de base de données d'extraction et il fonctionne dans la bibliothèque Brindille « autonome ». Maintenant, je veux l'utiliser dans Symfony2 mais ne peut pas trouver où changer Brindille chargeur via les paramètres Symfony2.

Thx à l'avance pour des conseils sur cette

Était-ce utile?

La solution

Jetez un oeil à cette page sur GitHub. Spécialement <parameter key="twig.loader.class">Symfony\Bundle\TwigBundle\Loader\Loader</parameter>

Vous pouvez configurer cette clé dans votre config.yml

Autres conseils

Inscrivez-vous votre propre chargeur brindille + Twig_Loader_Chain dire pour essayer de charger avec votre chargeur dans un premier temps. Vous pouvez créer et ajouter autant de chargeurs à votre Twig_Loader_Chain que vous voulez.

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

Maintenant, vous devez créer votre chargeur. chargeurs Brindille doivent mettre en œuvre Twig_LoaderInterface .

Acme / CoreBundle / Brindille / chargeur / Filesystem.php

pseudocode:     

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

    //...
}

Maintenant, nous avons défini nos services et a créé un nouveau chargeur. Le problème est que Brindille ne connaît pas notre nouveau Twig_Loader et utilise encore son propre -Default- « twig.loader ».

de vérifier exécuté sur CLI

conteneur app / console: debug twig.loader

Pour modifier les services en dehors de votre propre pack vous devez utiliser CompilerPasses. Créer notre propre qui affecte votre service de chargement à l'environnement brindille:

Acme / CoreBundle / injection de dépendances / compilateur / 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')));
    }
}

Il est l'appel « addMethodCall » qui ne fait rien de plus que la définition d'une injection de setter comme dans les définitions de service. La différence est que dans un compilateur passer vous pouvez accéder à tous les services, non seulement vos propres petits. Comme vous pouvez le voir le chargeur de la chaîne a été définie comme le nouveau chargeur pour l'environnement brindille.

Pour accomplir cette tâche, vous devez dire Symfony qu'il doit utiliser ce passage du compilateur. passe du compilateur peuvent être ajoutés dans votre 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());
    }
}

Si le fichier correspondant n'existe pas votre nouvelle Twig_Loader_Filesystem renvoie une erreur et le chargeur de la chaîne se poursuit par défaut brindille chargeur comme fallback.

Pour remplacer la clé de votre config.yml vous devez le faire en vertu des services brindille pas comme il Soutenons pas dans l'analyseur de configuration au moment (2.0.9)

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

services:
        twig.loader:
            class: Acme\CoreBundle\Twig\Loader\FilesystemLoader
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top