我试图从树枝延伸中调用控制器。 我不想拨打controller as a service,因为我失去了所有花哨的快捷方式。
想要实现的就是在你做的时候像控制器一样调用控制器:
{{ render(controller(
'AppBundle:Article:recentArticles',
{ 'max': 3 }
)) }}
我看了"渲染"的源代码。并试图找到"控制器" twig的功能,但我没理解怎么做。 从现在起,我获得了一个令人不满意但功能强大的代码:
在我的枝条延伸中:
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
,我宁愿让树枝处理这个选择,但我无法找到方法。
我有两个问题:
- 你认为Symfony\Bridge\Twig\Extension\HttpKernelExtension
是否稳定应该明确地参考它?
- 如果不是,你会怎么做让枝条处理它?</ p>
答案 0 :(得分:1)
您还可以从Twig_SimpleFunction
获取Twig_Environment
:
$renderFunction = $environment->getFunction('render'); // get the env via initRuntime(..) in your extension
$callable = $renderFunction->getCallable();
但是,我不建议依赖Twig内部。您应该将功能提取到服务中。