Я использую Symfony 4.x и в настоящее время включаю компоненты в шаблоны Twig следующим образом:
my-template.twig
{% include '/components/my-component.twig'
with {
data1 : some_array,
data2 : some_string
}
%}
In в приведенном выше примере my-component.twig
необходимо передать в него data1
и data2
. Это означает, что эти два элемента данных должны быть доступны для my-template.twig
..., что означает, что мне нужно сделать их доступными в контроллере, который загружает my-template.twig
.
class MyController extends Controller {
// ...
$data = [
'data1' = [ /* some array data */ ];
'data2' = 'a string';
];
$res = $this->renderView('my-template.twig', $data);
return new Response($res);
}
Проблема, с которой я сталкиваюсь, заключается в том, что я могу использовать my-component.twig
в десятках разных шаблонов, каждый со своими отдельными контроллерами. Мне нужно будет включить data1
и data2
в каждый из этих контроллеров отдельно только ради my-component.twig
.
Я немного обошел эту проблему, включив общие объекты данных в службу и включив эту службу во все контроллеры, которым требуется определенный фрагмент данных, но это тоже не идеально.
Что было бы идеальным, так это если бы конкретный компонент Twig был полностью самоинкапсулирован - это означает, что я могу свободно включить его в шаблон, и он автоматически захватит все свои данные. То есть у компонента есть собственный выделенный «контроллер», то есть код PHP, который автоматически запускается каждый раз, когда визуализируется конкретный шаблон (компонент) Twig, без необходимости явно указывать это.
Возможно ли что-то подобное в Symfony?