Як вбудовувати контролери у шаблон

Дата оновлення перекладу 2023-06-22

Як вбудовувати контролери у шаблон

У деяких випадках, вам потрібно буде зробити більше, ніж увімкнути простий шаблон. Уявіть, що у вас у макеті є бічна врізка, яка містить три останні статті. Отримання цих трьох статей може включати в себе запит DB або виконання іншої важкої логіки, яку не можна виконати з шаблону.

Note

Відображення вбудованих контролерів "важче", ніж увімкнення шаблону або виклик користувацької функції Twig. Якщо ви не плануєте кешувати фрагмент, то краще уникати вбудовування безлічі контролерів.

Рішенням є просто вбудувати результат усього контролера з вашого шаблону. Для початку, створіть контролер, який відображає точну кількість останніх статей:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// src/AppBundle/Controller/ArticleController.php
namespace AppBundle\Controller;

// ...

class ArticleController extends Controller
{
    public function recentArticlesAction($max = 3)
    {
        // виконайте виклик до DB або іншу логіку,
        // щоб отримати "$max" найостанніших статей
        $articles = ...;

        return $this->render(
            'article/recent_list.html.twig',
            array('articles' => $articles)
        );
    }
}

Шаблон recent_list абсолютно прямолінійний:

1
2
3
4
5
6
{# app/Resources/views/article/recent_list.html.twig #}
{% for article in articles %}
    <a href="/article/{{ article.slug }}">
        {{ article.title }}
    </a>
{% endfor %}

Note

Зазначте, що URL статті жорстко закодований у цьому прикладі (наприклад, /article/*slug*). Це не погана практика. У наступному розділі, ви дізнаєтеся, як робити це правильно.

Щоб увімкнути контролер, вам знадобиться послатися на нього, використовуючи стандартний синтаксис рядка для контролерів (тобто bundle:controller:action):

1
2
3
4
5
6
7
8
9
{# app/Resources/views/base.html.twig #}

{# ... #}
<div id="sidebar">
    {{ render(controller(
        'AppBundle:Article:recentArticles',
        { 'max': 3 }
    )) }}
</div>

Результат вбудованого контролера також може бути кешований