我编写了自定义的Twig加载器,可以从数据库中获取模板,它可以在Twig"独立"库中运行.现在我想在Symfony2中使用它,但无法通过Symfony2设置找到更改Twig加载器的位置.
请提前获取任何提示
注册您自己的枝条装载机+告诉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] ]
Run Code Online (Sandbox Code Playgroud)
现在你应该创建你的装载机.Twig加载器必须实现Twig_LoaderInterface.
ACME/CoreBundle /嫩枝/装载机/ Filesystem.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...
}
//...
}
Run Code Online (Sandbox Code Playgroud)
现在我们定义了我们的服务并创建了一个新的加载器.问题是Twig不知道我们的新Twig_Loader并且仍然使用它自己的-default-"twig.loader".
要检查CLI上的运行:
app/console container:debug twig.loader
要修改自己的bundle之外的服务,必须使用CompilerPasses.创建我们自己的,将您的加载器服务分配给twig环境:
ACME/CoreBundle/DependencyInjection /编译器/ 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')));
}
}
Run Code Online (Sandbox Code Playgroud)
有一个"addMethodCall"调用,它只是在服务定义中定义一个setter注入.不同之处在于,在编译器传递中,您可以访问每个服务,而不仅仅是您自己的服务.如您所见,链式加载器已被定义为树枝环境的新加载器.
要完成此任务,您必须告诉Symfony它应该使用此编译器传递.可以在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());
}
}
Run Code Online (Sandbox Code Playgroud)
如果相应的文件不存在,则新的Twig_Loader_Filesystem将抛出错误,并且链式加载器继续使用默认的twig加载程序作为回退.
| 归档时间: |
|
| 查看次数: |
3688 次 |
| 最近记录: |