Как изменить загрузчик Twig через настройки Symfony2 - PullRequest
3 голосов
/ 13 января 2011

Я написал собственный загрузчик Twig, который извлекает шаблоны из базы данных, и он работает в «автономной» библиотеке Twig. Теперь я хочу использовать это в Symfony2, но не могу найти, где изменить загрузчик Twig через настройки Symfony2.

Спасибо заранее за любые советы по этому вопросу

Ответы [ 3 ]

9 голосов
/ 25 июня 2014

Зарегистрируйте свой собственный загрузчик веток + сообщите Twig_Loader_Chain, чтобы сначала попытаться загрузить его с вашим загрузчиком.Вы можете создать и добавить столько загрузчиков к вашему Twig_Loader_Chain , сколько захотите.

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

Теперь вы должны создать свой загрузчик.Загрузчики веток должны реализовать Twig_LoaderInterface .

Acme / CoreBundle / Twig / Loader / 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...
    }

    //...
}

Теперь мы определили наши сервисы и создали новый загрузчик.Проблема в том, что Twig не знает о нашем новом Twig_Loader и все еще использует свой собственный -default- "twig.loader".

Чтобы проверить запуск на CLI:

Контейнер приложения / консоли: debug twig.loader

Чтобы изменить сервисы вне вашего собственного пакета, вы должны использовать CompilerPasses.Создайте наш собственный, который назначает службу загрузчика для среды веток:

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

Существует "addMethodCallmsgstr "вызов, который делает не что иное, как определение внедрения сеттера, как в определениях службы.Разница в том, что на этапе компиляции вы можете получить доступ ко всем сервисам, а не только к вашим собственным.Как вы можете видеть, загрузчик цепей был определен как новый загрузчик для среды веток.

Чтобы выполнить эту задачу, вы должны сказать Symfony, что он должен использовать этот этап компилятора.Проходы компилятора могут быть добавлены в ваш класс комплектов:

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

Если соответствующий файл не существует, ваша новая система Twig_Loader_Filesystem выдает ошибку, и загрузчик цепочки продолжаетс загрузчиком веток по умолчанию в качестве запасного.

3 голосов
/ 13 января 2011

Посмотрите на эту страницу на GitHub. Специально <parameter key="twig.loader.class">Symfony\Bundle\TwigBundle\Loader\Loader</parameter>

Вы можете настроить этот ключ в вашем config.yml

1 голос
/ 09 января 2012

Чтобы перезаписать ключ в вашем config.yml, вы должны сделать это в службах, а не в ветке, поскольку в данный момент он не поддерживается в анализаторе конфигурации (2.0.9)

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

services:
        twig.loader:
            class: Acme\CoreBundle\Twig\Loader\FilesystemLoader
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...