2016-12-15 63 views
1

我试图从树枝延伸调用控制器。 我不想打电话给controller as a service,因为我会失去所有奇特的捷径。symfony - 调用一个控制器在树枝延伸的行动

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

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

我看着的“渲染”的源代码,并试图找到“控制器”树枝的功能,但我没有设法理解如何去做。 从现在我实现了一个不令人满意,但functionnal代码:

在我的树枝extention:

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

CmsExtension:cmsRenderHook.html.twig模板:

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

我认为(也许错误地),它会更快在没有模板步骤的情况下调用它。

编辑:我终于successed实现代码:

$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足够稳定以引用明确吗? - 如果不是,你会怎么做,让小枝处理它?

回答

1

你也可以得到来自Twig_EnvironmentTwig_SimpleFunction

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

不过,我建议不要依赖嫩枝内部。您应该将功能提取到服务中。

+0

我试过这个解决方案,但是我没有设法调用可调用函数。我是否必须使用call_user_function或将其用作匿名函数? (我使用PHP 5.2多年,所以我问多么愚蠢的问题,抱歉) – Bruno