Функция controller
Функция controller позволяет вызвать
контроллер прямо из Twig-шаблона. Первым
параметром передаётся имя контроллера в формате
App\Controller\ArticleController::index,
вторым - массив параметров, которые будут
переданы в метод контроллера.
Функция возвращает результат выполнения
контроллера. Если контроллер возвращает объект
Response, Symfony отрендерит его содержимое.
Это удобно, когда нужно встроить часть страницы,
которая формируется отдельным контроллером.
Синтаксис
{{ controller('App\\Controller\\ArticleController::index', {param: value}) }}
Пример
Давайте создадим контроллер, который возвращает строку, и вызовем его из шаблона:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
class ArticleController extends AbstractController
{
public function index(): Response
{
return new Response('hello');
}
}
?>
Теперь вызовем этот контроллер из Twig-шаблона:
<p>{{ controller('App\\Controller\\ArticleController::index') }}</p>
Результат выполнения кода:
<p>hello</p>
Пример
Давайте передадим параметр в контроллер через второй аргумент функции:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
class ArticleController extends AbstractController
{
public function user(string $name): Response
{
return new Response($name);
}
}
?>
Вызовем метод user с параметром name:
<p>{{ controller('App\\Controller\\ArticleController::user', {name: 'abcde'}) }}</p>
Результат выполнения кода:
<p>abcde</p>
Пример
Давайте вызовем контроллер, который рендерит отдельный Twig-шаблон:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
class ArticleController extends AbstractController
{
public function list(): Response
{
return $this->render('article/list.html.twig', [
'items' => ['a', 'b', 'c', 'd', 'e'],
]);
}
}
?>
Шаблон article/list.html.twig выводит
переданный массив:
<ul>
{% for item in items %}
<li>{{ item }}</li>
{% endfor %}
</ul>
Теперь вызовем этот контроллер из основного шаблона:
<div>
{{ controller('App\\Controller\\ArticleController::list') }}
</div>
Результат выполнения кода:
<div>
<ul>
<li>a</li>
<li>b</li>
<li>c</li>
<li>d</li>
<li>e</li>
</ul>
</div>