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).

5
Другие вопросы по тегам