【问题标题】:symfony - call a controller-action within a twig extentionsymfony - 在树枝扩展中调用控制器动作
【发布时间】:2016-12-15 09:19:49
【问题描述】:

我正在尝试从树枝扩展中调用控制器。 我不想打电话给controller as a service,因为我会失去所有花哨的快捷方式。

我想要实现的是当你这样做时像twig一样调用控制器:

 {{ 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,我宁愿让twig处理这个选择,但我不知道如何。

我有两个问题: - 你认为Symfony\Bridge\Twig\Extension\HttpKernelExtension 足够稳定,可以明确引用它吗? - 如果不是,你会如何让 twig 处理它?

【问题讨论】:

    标签: php symfony twig twig-extension


    【解决方案1】:

    您也可以从Twig_Environment 获取Twig_SimpleFunction

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

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

    【讨论】:

    • 我尝试了这个解决方案,但我没有设法调用可调用对象。我必须使用 call_user_function 还是将其用作匿名函数? (我使用 PHP 5.2 多年,所以我提出了非常愚蠢的问题,抱歉)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-09
    • 2021-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多