Điểm:0

Thay đổi mảng kết xuất của bộ điều khiển thông qua KernelEvents::VIEW

lá cờ jp

Tôi đang cố gắng thay đổi đầu ra của bộ điều khiển mô-đun đóng góp thông qua KernelEvents::VIEW. Tôi muốn hiển thị đầu ra từ bộ điều khiển và thêm phần đánh dấu được trả về từ trình xử lý sự kiện. Đây là mã tôi đang sử dụng, nhưng nó không hoạt động như mong đợi.

lớp BuildAlter triển khai EventSubscriberInterface {

  chức năng công cộng alterBuild(ViewEvent $event) {
    $build = $event->getControllerResult();
    $build['nội dung'] = [
      '#type' => 'đánh dấu',
      '#markup' => '<p>Được thêm bởi ControllerAlterSubscriber.</p>'
    ];

    $event->setControllerResult($build);
  }

  hàm tĩnh công khai getSubscribeEvents() {
    trở lại [
      // Sự kiện VIEW xảy ra khi giá trị trả về của controller
      // không phải là một thể hiện Phản hồi.
      KernelEvents::VIEW => ['alterBuild', 50],
    ];
  }

}
4uk4 avatar
lá cờ cn
Bạn cần đăng ký dịch vụ trong *.services.yml. Xem https://drupal.stackexchange.com/questions/281093/is-there-a-best-practice-for-overriding-a-contributed-modules-controller-in-d/281158#281158
Nicholas avatar
lá cờ jp
Sự cố, $build['content'] không được tham chiếu trong nhánh chính mà tôi muốn thay đổi, xem bên dưới cách nội dung được xuất ra trong twig. `{{ đã kiểm tra lần cuối }}` {% cho project_type trong project_types %} {{ project_type.table }} {% khác %} {% endfor %} ` Tôi có nên mở một sự cố để xuất $build['content'] cho tệp twig đó không, để những người nghe sự kiện khác có thể thay đổi/thêm đầu ra thông qua phím 'nội dung'? Tôi bị lạc.
lá cờ cn
_Tôi có nên mở một vấn đề không_ Tôi không nghĩ điều đó là phù hợp, không có quy ước hay phương pháp hay nhất nào nói rằng một biến `'nội dung'` phải được sử dụng cho mẫu Twig. Có lẽ bạn có thể nghĩ về việc thay đổi tuyến đường thay thế và xây dựng chế độ xem của riêng bạn dựa trên bản gốc cộng với những thay đổi của bạn?
4uk4 avatar
lá cờ cn
Phần đánh dấu trong `nội dung` là mục kết xuất riêng của nó. Một biến sẽ là `#content` nếu được đặt cùng với một mẫu `#theme`.
Nicholas avatar
lá cờ jp
Cảm ơn bạn @Clive, sẽ sử dụng phương pháp này
apaderno avatar
lá cờ us
Lớp [`ViewEvent`](https://api.drupal.org/api/drupal/vendor%21symfony%21http-kernel%21Event%21ViewEvent.php/class/ViewEvent/9.2.x) chỉ khả dụng trên Drupal 9 . Trên Drupal 8, lớp sẽ sử dụng là [`GetResponseForControllerResultEvent`](https://api.drupal.org/api/drupal/vendor%21symfony%21http-kernel%21Event%21GetResponseForControllerResultEvent.php/class/GetResponseForControllerResultEvent/9.2. x). Mã lõi Drupal không giúp ích nhiều trong việc hiểu cách triển khai trình xử lý sự kiện đó. Không có trình xử lý sự kiện nào do lõi Drupal triển khai sử dụng `setControllerResult()`.
apaderno avatar
lá cờ us
Nhìn vào mã lõi Drupal được sử dụng cho loại trình xử lý sự kiện đó, tôi chỉ có thể hiểu rằng trình xử lý sự kiện không nên coi giá trị được trả về từ `$event->getControllerResult()` là một mảng. `RenderArrayNonHtmlSubscriber::onRespond()` và `MainContentViewSubscriber::onViewRenderArray()` kiểm tra xem giá trị được trả về có phải là một mảng không và giả sử đó là một mảng kết xuất. `PsrResponseSubscriber::onKernelView()` kiểm tra giá trị trả về thực hiện `ResponseInterface`.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.