データベースからテンプレートをフェッチするカスタム Twig ローダーを作成しました。これは Twig の「スタンドアロン」ライブラリで動作します。これを Symfony2 で使用したいのですが、Symfony2 の設定で Twig ローダーを変更する場所が見つかりません。
それに関するヒントについては、事前にThx
独自の 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] ]
次に、ローダーを作成する必要があります。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...
}
//...
}
これで、サービスを定義し、新しいローダーを作成しました。問題は、Twig が新しい Twig_Loader を認識せず、独自の -default- "twig.loader" を使用していることです。
CLI で実行を確認するには:
app/console コンテナー: デバッグ twig.loader
独自のバンドル外のサービスを変更するには、CompilerPasses を使用する必要があります。ローダー サービスを twig 環境に割り当てる独自のサービスを作成します。
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')));
}
}
サービス定義のようにセッター注入を定義するだけの「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 ローダーをフォールバックとして続行します。
GitHubのこのページを見てください。特に<parameter key="twig.loader.class">Symfony\Bundle\TwigBundle\Loader\Loader</parameter>
このキーは config.yml で設定できます
config.yml のキーを上書きするには、現時点では設定パーサー (2.0.9) でサポートされていないため、twig 以外のサービスで行う必要があります。
twig:
cache:...
debug:...
...
services:
twig.loader:
class: Acme\CoreBundle\Twig\Loader\FilesystemLoader