Зарегистрируйте свой собственный загрузчик веток + сообщите 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 выдает ошибку, и загрузчик цепочки продолжаетс загрузчиком веток по умолчанию в качестве запасного.