Как изменить погрузчик веток через настройки Symfony2
Вопрос
Я написал пользовательский 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