2016-12-15 6 views
1

Я пытаюсь вызвать контроллер из расширения ветки. Я не хочу называть controller as a service, так как я потеряю все причудливые ярлыки.symfony - вызов контроллера-действия в расширении веточки

Хочет, я хочу добиться того, чтобы позвонить контроллеру как прутик сделать это, когда вы делаете:

{{ 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)) }} 

Я думаю, что (возможно, ошибочно), что было бы быстрее для вызова без шага шаблона.

EDIT: я, наконец, закодировать В случае успешного это:

$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 устойчива к refere прийти явно к нему? - если нет, как бы вы сделали, чтобы позволить веточку обрабатывать его?

ответ

1

Вы также могли бы получить Twig_SimpleFunction от Twig_Environment:

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

Однако, я бы не рекомендовал полагаться на Twig внутренностей. Вероятно, вы должны извлечь функциональность в службу.

+0

Я пробовал это решение, но мне не удалось вызвать вызываемый. Нужно ли использовать функцию call_user_function или использовать ее как анонимную функцию? (Я использовал PHP 5.2 в течение многих лет, поэтому я спрашиваю, насколько глупые вопросы, извините) – Bruno

Смежные вопросы