1

我正在尝试从树枝扩展中调用控制器。我不想将控制器称为服务,因为我会失去所有花哨的快捷方式。

我想要实现的是在你做的时候像树枝一样调用控制器:

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

我查看了“渲染”的源代码并试图找到“控制器”树枝的功能,但我不明白该怎么做。从现在开始,我实现了一个令人不满意但功能强大的代码:

在我的树枝扩展中:

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']
    )
);

(我在 twig 的缓存中做了一个 grep 并复制了它的编译版本)。我唯一关心的是参考Symfony\Bridge\Twig\Extension\HttpKernelExtension,我宁愿让树枝处理这个选择,但我不知道如何。

我有两个问题: - 你认为这Symfony\Bridge\Twig\Extension\HttpKernelExtension足够稳定来明确引用它吗?- 如果不是,你会怎么做让树枝处理它?

4

1 回答 1

1

你也可以Twig_SimpleFunctionTwig_Environment

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

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

于 2016-12-15T13:03:49.910 回答