2016-12-15 106 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