Компонентный контроллер в Twig с Symfony PHP - PullRequest
0 голосов
/ 29 мая 2020

Я использую 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?

1 Ответ

3 голосов
/ 29 мая 2020

Если я правильно понимаю, вы хотите использовать метод #render () в ветке.

Вы создаете метод в своем контроллере, т.е. myComponentRender (), а затем вы можете сделать это вместо включения

{{ render(controller(
    'App\\Controller\\MyController::myComponentRender',
    { 'foo': 'bar' }
)) }}

Я включил параметр foo, чтобы показать вам, что можно передать параметр, если вам нужно (если вы хотите различать guish, какая страница вызывает его, например), но вы, вероятно, не нужно ничего передавать, судя по вашему примеру

Чтобы уточнить, в вашем методе myComponentRender () вам нужно вернуть $ this-> render (...)

вот ссылка на самом деле https://symfony.com/doc/4.1/templating/embedding_controllers.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...