Як вбудовувати контролери у шаблон
Дата оновлення перекладу 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>
Результат вбудованого контролера також може бути кешований