2012-03-03 13 views
13

私はいくつかのことをするためにtwig拡張を作りました。そのうちの1つはテンプレートをレンダリングしています。どのようにして、エンジンの環境をツリーの拡張機能の内部からアクセスし、Renderメソッドを呼び出すことができますか?ユーザーは、それが環境を必要とするように、あなたは拡張子を定義することができ小枝拡張子twig extensionからテンプレートをレンダリングする

private $environment; 

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

答えて

35

に小枝環境のインスタンスを渡すことができ、この機能を使用する

+4

\ Twig_Function_Methodは廃止予定です。\ Twig_SimpleFunctionを使用してください。 – spectralsun

19

。 Twigはそれを自動的に関数に渡します。

public function getFunctions() 
{ 
    return array(
     new \Twig_SimpleFunction(
      'myfunction', 
      array($this, 'myFunction'), 
      array('needs_environment' => true) 
     ), 
    ); 
} 

public function myFunction(\Twig_Environment $environment, string $someParam) 
{ 
    // ... 
} 
+4

と連携{{ myMenu() }}を追加しましたTWIGテンプレートに

app.twig.menu_extension: class: AppBundle\Twig\MenuExtension public: false tags: - { name: twig.extension } 

私はまた、symfonyのサービスとしてクラスを登録しましたthis-> environment-> render() – ojreadmore

+4

initRuntimeは廃止予定です。 @tvlooyによるneeds_environmentが正解です。 – MECU

5

@tvlooy回答私にはヒントはありますが、私のためには役に立たなかった。私はそれを達成するためにするために必要なことは次のとおりです。

namespace AppBundle\Twig; 


class MenuExtension extends \Twig_Extension 
{ 
    public function getName() 
    { 
     return 'menu_extension'; 
    } 

    public function getFunctions() 
    { 
     return [ 
      new \Twig_SimpleFunction('myMenu', [$this, 'myMenu'], [ 
       'needs_environment' => true, 
       'is_safe' => ['html'] 
      ]) 
     ]; 
    } 

    public function myMenu(\Twig_Environment $environment) 
    { 
      return $environment->render('AppBundle:Menu:main-menu.html.twig'); 
    } 
} 

私はaddtionaly HTMLの自動エスケープを避けるために'is_safe' => ['html']を追加する必要がありました。私は

私はその後、$を行う"twig/twig": "~1.10"とsymfony 3.1.3バージョン

+0

'needs_environment' =>ここでの真実は本当です。 +1 –

関連する問題