Symfony2 - контроллер рендеринга Twig и ответ массива возврата
Примечание. То, что я здесь делаю, это встраивание контроллеров <--- смотрите эту ссылку для аналогичного (официального) примера.
Я хочу вызвать контроллер из шаблона ветки, и этот контроллер должен вернуть массив, который я затем смогу использовать в оставшейся части моего шаблона.
Я могу сделать это с отдельными переменными:
прут
{% set testVar = render(controller('AppBundle:Test:index')) %}
контроллер
class TestController extends Controller
{
public function testAction()
{
return new Response('OH HAI');
}
}
Однако следующее выдает исключение: ("The Response content must be a string or object implementing __toString(), "array" given.")
с тем же файлом ветки.
public function testAction()
{
return new Response(array('test' => 1, 'foo' => 'bar'));
}
Это бросает вышеупомянутое исключение. Как я могу выполнить то, что я ищу, не создавая фиктивный, бесполезный дополнительный шаблон для рендеринга контроллера?
1 ответ
Стандартный способ достижения того, что вы хотите, выглядит примерно так.
Предположим, у вас есть регулярные действия. Например.
class TestController extends Controller
{
public function testAction()
{
return $this->render('AppBundle:Test:index.html.twig');
}
}
И шаблон:
<html>
<body>
{% block sidebar %}
{{ controller('AppBundle:Test:sidebar') }}
{% endblock %}
{% block content %}
Hello world
{% endblock %}
</body>
</html>
Далее вам нужно создать какое-то действие для боковой панели. Обратите внимание, что таким образом вы избегаете размещения какой-либо логики в вашем слое представления.
class BaseController extends Controller
{
public function sidebarAction()
{
$status = $this->get('some.status.logic')->retrieveStatus();
return $this->render('AppBundle:Base:sidebar.html.twig', array(
'status' => $status,
));
}
}
И ваш Base/sidebar.html.twig
:
<div class="sidebar">
{{ status.showStatusInfo() }}
</div>
И это все. Вы не нарушаете MVP таким образом, потому что у вас все еще нет никакой логики в вашем слое представления (логика для боковой панели находится в BaseController
).