symfony - 在树枝扩展中调用控制器操作

时间:2016-12-15 09:19:49

标签: php symfony twig twig-extension

我试图从树枝延伸中调用控制器。 我不想拨打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>

1 个答案:

答案 0 :(得分:1)

您还可以从Twig_SimpleFunction获取Twig_Environment

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

但是,我不建议依赖Twig内部。您应该将功能提取到服务中。