Как изменить погрузчик веток через настройки Symfony2

StackOverflow https://stackoverflow.com/questions/4682796

  •  10-10-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

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

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

Другие советы

Зарегистрируйте свой собственный Twig Loader + Sight 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/fileystem.php

Псевдокод:

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 и все еще использует свой собственный -Дфо -умол -"twig.loader".

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

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

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

Acme/corebundle/degyNedInection/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')));
    }
}

Существует звонок «addmethodcall», который делает не более чем определение инъекции сеттера, как в определениях службы. Разница в том, что в проходе компилятора вы можете получить доступ к каждому сервису, не только своим собственным. Как видите, цепной погрузчик был определен как новый погрузчик для среды Twig.

Чтобы выполнить эту задачу, вы должны сказать 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 бросает ошибку, а загрузчик цепочки продолжается с загрузчиком TWIG по умолчанию в качестве запасного.

Чтобы перезаписать ключ в вашем конфигурации.

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

services:
        twig.loader:
            class: Acme\CoreBundle\Twig\Loader\FilesystemLoader
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top