3

データベースからテンプレートをフェッチするカスタム Twig ローダーを作成しました。これは Twig の「スタンドアロン」ライブラリで動作します。これを Symfony2 で使用したいのですが、Symfony2 の設定で Twig ローダーを変更する場所が見つかりません。

それに関するヒントについては、事前にThx

4

3 に答える 3

9

独自の 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 ローダーをフォールバックとして続行します。

于 2014-06-25T14:31:10.390 に答える
3

GitHubのこのページを見てください。特に<parameter key="twig.loader.class">Symfony\Bundle\TwigBundle\Loader\Loader</parameter>

このキーは config.yml で設定できます

于 2011-01-13T19:17:15.153 に答える
1

config.yml のキーを上書きするには、現時点では設定パーサー (2.0.9) でサポートされていないため、twig 以外のサービスで行う必要があります。

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

services:
        twig.loader:
            class: Acme\CoreBundle\Twig\Loader\FilesystemLoader
于 2012-01-09T00:32:02.867 に答える