Рейтинг:0

Изменить массив рендеринга контроллера через KernelEvents::VIEW

флаг jp

Я пытаюсь изменить вывод контроллера модуля contrib через Кернелеевентс:: ПРОСМОТР. Я хочу отобразить вывод контроллера и добавить разметку, возвращенную обработчиком событий. Это код, который я использую, но он не работает должным образом.

класс BuildAlter реализует EventSubscriberInterface {

  публичная функция alterBuild(ViewEvent $event) {
    $build = $event->getControllerResult();
    $сборка['контент'] = [
      '#type' => 'разметка',
      '#markup' => '<p>Добавлено ControllerAlterSubscriber.</p>'
    ];

    $event->setControllerResult($build);
  }

  общедоступная статическая функция getSubscribedEvents() {
    возвращаться [
      // Событие VIEW происходит, когда возвращаемое значение контроллера
      // не является экземпляром Response.
      KernelEvents::VIEW => ['alterBuild', 50],
    ];
  }

}
4uk4 avatar
флаг cn
Вам необходимо зарегистрировать сервис в *.services.yml. См. https://drupal.stackexchange.com/questions/281093/is-there-a-best-practice-for-overriding-a-contributed-modules-controller-in-d/281158#281158
Nicholas avatar
флаг jp
Проблема в том, что $build['content'] не упоминается в основной ветке, которую я хочу изменить, см. ниже, как контент выводится в twig. `{{ last_checked }}` {% для project_type в project_types %} {{тип_проекта.таблица}} {% еще %} {% конец для %} ` Должен ли я открыть вопрос для вывода $build['content'] для этого файла ветки, чтобы другие прослушиватели событий могли изменить/добавить вывод с помощью ключа «content»? Я заблудился.
флаг cn
_Должен ли я открывать вопрос_ Я не думаю, что это было бы уместно, в соглашении или передовой практике нет ничего, говорящего о том, что переменная `'content'` должна использоваться для шаблона Twig. Возможно, вы могли бы вместо этого подумать об изменении маршрута и создании собственного представления на основе оригинала и ваших изменений?
4uk4 avatar
флаг cn
Разметка в `content` является собственным элементом рендеринга. Переменная будет `#content`, если будет размещена с шаблоном `#theme`.
Nicholas avatar
флаг jp
Спасибо @Clive, буду использовать этот подход
apaderno avatar
флаг us
Класс [`ViewEvent`](https://api.drupal.org/api/drupal/vendor%21symfony%21http-kernel%21Event%21ViewEvent.php/class/ViewEvent/9.2.x) доступен только в Drupal 9. В Drupal 8 используется класс [`GetResponseForControllerResultEvent`](https://api.drupal.org/api/drupal/vendor%21symfony%21http-kernel%21Event%21GetResponseForControllerResultEvent.php/class/GetResponseForControllerResultEvent/9.2. Икс). Код ядра Drupal не очень помогает понять, как реализовать этот обработчик событий. Ни один из обработчиков событий, реализованных ядром Drupal, не использует `setControllerResult()`.
apaderno avatar
флаг us
Глядя на код ядра Drupal, используемый для этого типа обработчика событий, я могу только понять, что обработчик событий не должен предполагать, что значение, возвращаемое из `$event->getControllerResult()`, является массивом. `RenderArrayNonHtmlSubscriber::onRespond()` и `MainContentViewSubscriber::onViewRenderArray()` проверяют, что возвращаемое значение является массивом, и предполагают, что это массив рендеринга. `PsrResponseSubscriber::onKernelView()` проверяет, что возвращаемое значение реализует `ResponseInterface`.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.