2016-12-15 8 views
1

私はtwigエクステンションからコントローラを呼び出そうとしています。 私はcontroller as a serviceに電話をかけたくありません。なぜなら、すばらしいショートカットをすべて失うからです。symfony - twigエクステンション内でコントローラアクションを呼び出す

は私が達成したいしたいあなたが行うとき小枝のようなコントローラがそれを行う呼び出すことです:

{{ render(controller(
    'AppBundle:Article:recentArticles', 
    { 'max': 3 } 
)) }} 

私は「レンダリング」のソースコードを見て、「コントローラ」小枝の機能を見つけることを試みました、私はそのやり方を理解することができませんでした。 CmsExtension:cmsRenderHook.html.twigテンプレートで

return $environment->render('FooBundle:TwigExtension/CmsExtension:cmsRenderHook.html.twig', [ 
    'hook' => $hook, 
]); 

:(誤って多分)私が思う

{{ render(controller(hook.stringControllerAction, hook.arrayParameters)) }} 

それは速いだろうというのが私の小枝の拡張子で

:今から は、私は満足のいかないが、functionnalコードを達成しましたテンプレートステップなしで呼び出すことができます。

編集:私は最終的にこれをコーディングするsuccessed

$environment->getExtension('Symfony\Bridge\Twig\Extension\HttpKernelExtension')->renderFragment(
    $environment->getExtension('Symfony\Bridge\Twig\Extension\HttpKernelExtension')->controller(
     $hook['action'], 
     $hook['jsonParameters'] 
    ) 
); 

(私は小枝のキャッシュ内のgrepを行なったし、コンパイル済みのバージョンにそれを再現)。 私の唯一の心配はSymfony\Bridge\Twig\Extension\HttpKernelExtensionを参照することです、私はむしろ小枝にこの選択を処理させたいと思いますが、私はどのように見つけることができません。

私は2つの質問があります。 - あなたはSymfony\Bridge\Twig\Extension\HttpKernelExtensionがenoughtそれに明示的REFEREし安定していると思いますか? - もしあなたがそれを扱うようにしたいのであれば?

答えて

1

またTwig_EnvironmentからTwig_SimpleFunctionを得ることができる:

$renderFunction = $environment->getFunction('render'); // get the env via initRuntime(..) in your extension 
$callable = $renderFunction->getCallable(); 

しかし、私は小枝の内部に頼ることをお勧めしません。おそらく機能をサービスに抽出する必要があります。

+0

私はこの解決策を試みましたが、私は呼び出し可能呼び出しを呼び出すことができませんでした。 call_user_functionを使用するか、それを匿名関数として使用する必要がありますか? (私は何年もPHP 5.2を使用していましたので、愚かな質問をしています、ごめんなさい) – Bruno

関連する問題