1

小枝拡張からコントローラーを呼び出そうとしています。派手なショートカットがすべて失われるため、コントローラーをサービスとして呼び出したくありません。

私が達成したいのは、小枝のようにコントローラーを呼び出すことです。

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

「render」のソースコードを見て、「controller」小枝の機能を見つけようとしましたが、どうすればよいかわかりませんでした。今から、満足できないが機能的なコードを達成しました:

私の小枝の拡張では:

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

CmsExtension:cmsRenderHook.html.twigテンプレート内:

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

テンプレートステップなしで呼び出す方が速いと思います(間違っているかもしれません)。

編集:私は最終的にこれをコーディングすることに成功しました:

$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です。この選択は twig に処理させたいのですが、方法がわかりません。

2 つの質問があります:Symfony\Bridge\Twig\Extension\HttpKernelExtension - それを明示的に参照するのに十分安定し ていると思いますか? -そうでない場合、小枝にそれを処理させるにはどうすればよいですか?

4

1 に答える 1

1

Twig_SimpleFunctionからを取得することもできますTwig_Environment:

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

ただし、Twig 内部に依存することはお勧めしません。おそらく、機能をサービスに抽出する必要があります。

于 2016-12-15T13:03:49.910 に答える