Score:0

แก้ไขอาร์เรย์เรนเดอร์ของคอนโทรลเลอร์ผ่าน KernelEvents::VIEW

ธง jp

ฉันกำลังพยายามแก้ไขเอาต์พุตของคอนโทรลเลอร์โมดูล contrib ผ่าน KernelEvents::VIEW. ฉันต้องการแสดงเอาต์พุตจากคอนโทรลเลอร์และเพิ่มมาร์กอัปที่ส่งคืนจากตัวจัดการเหตุการณ์ นี่คือรหัสที่ฉันใช้ แต่ใช้งานไม่ได้ตามที่คาดไว้

class BuildAlter ใช้ EventSubscriberInterface {

  ฟังก์ชั่นสาธารณะ alterBuild (ViewEvent $event) {
    $build = $event->getControllerResult();
    $สร้าง['เนื้อหา'] = [
      '#type' => 'มาร์กอัป',
      '#markup' => '<p>เพิ่มโดย ControllerAlterSubscriber</p>'
    ];

    $event->setControllerResult($build);
  }

  ฟังก์ชั่นคงที่สาธารณะ getSubscribedEvents () {
    กลับ [
      // เหตุการณ์ VIEW เกิดขึ้นเมื่อค่าส่งคืนของตัวควบคุม
      // ไม่ใช่อินสแตนซ์การตอบสนอง
      KernelEvents::VIEW => ['alterBuild', 50],
    ];
  }

}
4uk4 avatar
cn flag
คุณต้องลงทะเบียนบริการใน *.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 flag
ปัญหา $build['content'] ไม่ได้อ้างอิงในสาขาหลักที่ฉันต้องการแก้ไข ดูด้านล่างว่าเนื้อหาออกเป็นกิ่งก้านอย่างไร `{{ ตรวจสอบล่าสุด }}` {% สำหรับ project_type ใน project_types %} {{ project_type.table }} {% อื่น %} {% สิ้นสุดสำหรับ %} ` ฉันควรเปิดปัญหาเพื่อเอาต์พุต $build['content'] สำหรับไฟล์ twig นั้นหรือไม่ เพื่อให้ผู้ฟังเหตุการณ์อื่นสามารถแก้ไข/เพิ่มเอาต์พุตผ่านคีย์ 'content' ฉันหลงทาง.
cn flag
_ฉันควรเปิดประเด็นไหม_ ฉันไม่คิดว่ามันเหมาะสม ไม่มีแบบแผนหรือแนวปฏิบัติที่ดีที่สุดที่จะพูดว่าต้องใช้ตัวแปร `'content'` สำหรับเทมเพลต Twig บางทีคุณอาจคิดเกี่ยวกับการเปลี่ยนแปลงเส้นทางแทนและสร้างมุมมองของคุณเองตามต้นฉบับบวกกับการเปลี่ยนแปลงของคุณ
4uk4 avatar
cn flag
มาร์กอัปใน "เนื้อหา" เป็นรายการแสดงผลของมันเอง ตัวแปรจะเป็น `#content` หากวางด้วยเทมเพลต `#theme`
Nicholas avatar
jp flag
ขอบคุณ @Clive จะใช้แนวทางนี้
apaderno avatar
us flag
คลาส [`ViewEvent`](https://api.drupal.org/api/drupal/vendor%21symfony%21http-kernel%21Event%21ViewEvent.php/class/ViewEvent/9.2.x) มีเฉพาะใน Drupal 9 เท่านั้น ใน Drupal 8 คลาสที่จะใช้คือ x). โค้ดหลักของ Drupal ไม่ได้ช่วยให้เข้าใจวิธีการใช้ตัวจัดการเหตุการณ์นั้นมากนัก ไม่มีตัวจัดการเหตุการณ์ที่ใช้งานโดย Drupal core ที่ใช้ `setControllerResult()`
apaderno avatar
us flag
เมื่อดูที่โค้ดหลักของ Drupal ที่ใช้สำหรับตัวจัดการเหตุการณ์ประเภทนั้น ฉันสามารถเข้าใจได้ว่าตัวจัดการเหตุการณ์ไม่ควรถือว่าค่าที่ส่งคืนจาก `$event->getControllerResult()` เป็นอาร์เรย์ `RenderArrayNonHtmlSubscriber::onRespond()` และ `MainContentViewSubscriber::onViewRenderArray()` ตรวจสอบค่าที่ส่งคืนว่าเป็นอาร์เรย์ และถือว่ามันเป็นอาร์เรย์แสดงผล `PsrResponseSubscriber::onKernelView()` ตรวจสอบค่าที่ส่งคืนโดยใช้ `ResponseInterface`

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา