symfony — вызов действия контроллера в расширении ветки

Я пытаюсь вызвать контроллер из расширения ветки. Я не хочу вызывать контроллер как службу, так как я потеряю все причудливые ярлыки.

Я хочу добиться того, чтобы вызвать контроллер, например, 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)) }}

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

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, я бы предпочел, чтобы twig справился с этим выбором, но я не могу понять, как это сделать.

У меня два вопроса: - считаете ли вы, что Symfony\Bridge\Twig\Extension\HttpKernelExtension достаточно стабилен, чтобы ссылаться на него явно? - если нет, как бы ты позволил твигу справиться с этим?


person Bruno    schedule 15.12.2016    source источник


Ответы (1)


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

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

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

person OrangeSalty    schedule 15.12.2016
comment
Я попробовал это решение, но мне не удалось вызвать callable. Должен ли я использовать функцию call_user_function или использовать ее как анонимную функцию? (Я использовал PHP 5.2 в течение многих лет, поэтому задаю очень глупые вопросы, извините) - person Bruno; 15.12.2016