質問

データベースからテンプレートを取得するCustom Twigローダーを作成し、Twigの「Standalone」ライブラリで機能します。これでSymfony2で使用したいのですが、Symfony2設定を介してTwig Loaderを変更する場所が見つかりません。

そのヒントについては事前にthx

役に立ちましたか?

解決

見て このページ Githubで。特に <parameter key="twig.loader.class">Symfony\Bundle\TwigBundle\Loader\Loader</parameter>

config.ymlでこのキーを構成できます

他のヒント

独自の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/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

独自のバンドル以外のサービスを変更するには、コンパイラパスを使用する必要があります。 Loaderサービスを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ローダーをフォールバックとして継続します。

config.ymlのキーを上書きするには、現時点で構成パーサーでサポートされていないため、小枝ではないサービスでそれを行う必要があります(2.0.9)

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

services:
        twig.loader:
            class: Acme\CoreBundle\Twig\Loader\FilesystemLoader
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top