1

Symfony2 プロジェクトで、Twig_ExtensionInterface を実装するサービスを作成したので、Twig フィルターとして使用できます。{{ stuff|my_filter }}

このサービスでは、たとえば twig テンプレートを使用できるように twig 環境を使用する必要があるため、サービスで実行できるようにそれを注入しました。

services.yml で:

services:
    meta.twig.my_extension:
        class: Acme\GeneralBundle\Twig\MyExtension
        tags:
            - { name: twig.extension }
        arguments:
            twig: "@twig"

したがって、サービス自体は次のようになります。

<?php

namespace Acme\GeneralBundle\Twig;

class MyExtension extends \Twig_Extension
{

    public function __construct($twig)
    {
        $this->twig = $twig;
    }

    public function getFilters()
    {
        return array(
            'my_filter' => new \Twig_Filter_Method($this, 'myFunction'),
        );
    }

    public function myFunction($text)
    {
       return $this->twig->render($someTemplate,$someArguments);
    }
}

そして、私はそのようなコントローラーでそれを使用できます:

$myService = $this->container->get('Acme.twig.my_extension');
$text = $myService->myFunction($someValue);

しかし、もちろん、そうすると CircularReference エラーが発生します。

Circular reference detected for service "Acme.twig.my_extension", 
path: "Acme.twig.my_extension -> twig".

では、カスタム Twig Filter 内で twig->render() 関数を使用する最良の方法は何ですか?

どうもありがとう !

4

1 に答える 1

3

Twig_ExtensionInterfaceinitRuntime()小枝環境を引数として受け入れるメソッドを定義します。このメソッドは、拡張機能の初期化中に twig によって呼び出されます。

このメソッドの空の実装Twig_Extensionを既に提供しているクラスを拡張しました。あなたがしなければならないのは、それを上書きし、将来の使用のために小枝環境への参照を保存することだけです.

<?php

namespace Acme\GeneralBundle\Twig;

class MyExtension extends \Twig_Extension
{
    private $environment = null;

    public function initRuntime(\Twig_Environment $environment)
    {
        $this->environment = $environment;
    }

    public function getFilters()
    {
        return array(
            'my_filter' => new \Twig_Filter_Method($this, 'myFunction'),
        );
    }

    public function myFunction($text)
    {
       return $this->environment->render($someTemplate,$someArguments);
    }
}

ドキュメンテーション:拡張機能の作成.

于 2013-02-02T19:57:23.390 に答える