Score:2

ในกรณีที่ผู้สมัครสมาชิก จะเปลี่ยนเส้นทางได้อย่างไรหากไม่มีค่า

ธง zw

ฉันกำลังพยายามตรวจสอบเงื่อนไขก่อนการโหลดหน้าเว็บ หากมีค่าให้โหลดหน้าเว็บ หากไม่ต้องเปลี่ยนเส้นทาง

ฉันกำลังติดตามสิ่งนี้ หน้าหนังสือ

ฉันได้สร้างไฟล์ /mymodule/mymodule.services.yml และไฟล์ /mymodule/src/MyModuleSubscriber.php

ใน MyModuleSubscriber.php ฉันต้องการตรวจสอบว่ามีค่าอยู่หรือไม่ หากมีค่าให้โหลดไซต์ตามปกติ หากไม่มีค่าให้ดำเนินการเปลี่ยนเส้นทาง

นี่คือรหัส แต่ไม่แน่ใจว่าจะเขียนอย่างไรให้ถูกต้อง ฉันต้องใส่คำสั่งอื่นหรือเว้นว่างไว้

นี่เป็นวิธีที่ถูกต้องในการตรวจสอบค่าที่มีอยู่ในทุกการโหลดหน้าเว็บหรือไม่

คลาส MyModuleSubscriber ใช้ EventSubscriberInterface {

      ฟังก์ชั่นสาธารณะ checkForRedirect (GetResponseEvent $ เหตุการณ์) {

          $baseUrl = $event->getRequest()->getBaseUrl();

          if($value == null &&
             $baseURL !== '/MyModulePage') {
              $event->setResponse(redirectResponse ใหม่($baseUrl.'/MyModulePage'));
          }
      }


  /**
   * {@inheritdoc}
   */
  ฟังก์ชันคงที่ getSubscribedEvents () {
    $events[KernelEvents::REQUEST][] = array('MyModuleLoad', 200);
    ส่งคืนเหตุการณ์ $;
  }
}

แก้ไข:

      $path = \Drupal::service('path.current')->getPath();

      if($path !== '/MyModulePage') {
          $event->setResponse(new RedirectResponse('/MyModulePage'));
      }
May  avatar
zw flag
แก้ไข: มีการปรับปรุงรหัส สิ่งที่จะเกิดขึ้นคือหากผู้เยี่ยมชมไม่ได้ไปที่ /MyModulePage เพื่อเปลี่ยนเส้นทางพวกเขาไปที่ /MyModulePage แต่ไม่มีอะไรเกิดขึ้น
4uk4 avatar
cn flag
บริการ `path.current` ได้รับการอัปเดตระหว่างการกำหนดเส้นทาง คุณจะต้องได้รับเส้นทางจาก `$event->getRequest()->getPathInfo() ในช่วงต้น
May  avatar
zw flag
สวัสดี ยังใช้งานไม่ได้ ฉันคิดว่ามันเป็นปัญหาการแคช? มันใช้งานได้บางครั้ง บางครั้งก็ไม่ทำงาน ฉันจำเป็นต้องทำงานบนมิดเดิลแวร์แทนหรือฉันสามารถอัปเดตรหัสได้ ฉันต้องการคำสั่ง if ที่ตรวจสอบในการโหลดทุกหน้า ขอบคุณ
4uk4 avatar
cn flag
คำตอบของฉันอธิบายว่า Drupal ทำให้การเปลี่ยนเส้นทางแคชได้อย่างไร หากคุณยืนยันว่าโค้ดของคุณทำงานทุกครั้งที่โหลดหน้าเว็บ ซึ่งหมายความว่าคุณไม่ต้องการแคชการเปลี่ยนเส้นทางเลย ก่อนอื่นคุณต้องดูแลการแคชของเบราว์เซอร์ แคชจะเปลี่ยนเส้นทางค่อนข้างรุนแรง และอย่างที่สอง คุณต้อง ปิดใช้งานแคชเพจภายใน ดู[ความคิดเห็น](https://drupal.stackexchange.com/questions/278698/disabling-page-cache-for-redirect-response/278703#comment346356_278698)ในหัวข้อที่ฉันเชื่อมโยงไว้ที่ส่วนท้ายของคำตอบ
Score:4
ธง cn

ใช่ นี่เป็นแนวทางที่ถูกต้อง คุณไม่จำเป็นต้องมีคำสั่งอื่น หากคุณไม่ตั้งค่าการตอบกลับ การเผยแพร่เหตุการณ์จะไม่หยุด และสมาชิกเหตุการณ์ที่มีลำดับความสำคัญต่ำกว่าจะได้รับโอกาสในการตั้งค่าการตอบกลับ ลำดับความสำคัญขึ้นอยู่กับ $value คำถามของคุณไม่ชัดเจน แต่ถ้าไม่ได้ขึ้นอยู่กับสิ่งที่เฉพาะเจาะจงของ Drupal ให้กำหนดลำดับความสำคัญ >300

แนวทางปฏิบัติที่ดีที่สุดคือการใช้การตอบสนองที่แคชได้และเพิ่มการพึ่งพาของ $value ในการตอบกลับ หากคุณยังไม่มี ให้ใช้การตอบกลับนี้ มันบอก Drupal ว่าคุณสบายดีที่มันแคชว่าคุณต้องการเปลี่ยนเส้นทางนี้อย่างไร

ตัวอย่าง:

core/lib/Drupal/Core/EventSubscriber/RedirectLeadingSlashesSubscriber.php

<?php

เนมสเปซ Drupal\Core\EventSubscriber;

ใช้ Drupal\Core\Cache\CacheableRedirectResponse;
ใช้ Symfony\Component\HttpKernel\Event\RequestEvent;
ใช้ Symfony\Component\HttpKernel\KernelEvents
ใช้ Symfony\Component\EventDispatcher\EventSubscriberInterface;

/**
 * เปลี่ยนเส้นทางที่ขึ้นต้นด้วยเครื่องหมายทับหลายรายการเป็นเครื่องหมายทับเดียว
 */
คลาส RedirectLeadingSlashesSubscriber ใช้ EventSubscriberInterface {

  /**
   * เปลี่ยนเส้นทางที่ขึ้นต้นด้วยเครื่องหมายทับหลายรายการเป็นเครื่องหมายทับเดียว
   *
   * @param \Symfony\Component\HttpKernel\Event\RequestEvent $event
   * RequestEvent ที่จะประมวลผล
   */
  การเปลี่ยนเส้นทางของฟังก์ชันสาธารณะ (RequestEvent $event) {
    $request = $event->getRequest();
    // รับเส้นทางที่ร้องขอลบเส้นทางพื้นฐาน
    $path = $request->getPathInfo();

    // เป็นไปไม่ได้ที่จะสร้างลิงค์หรือเส้นทางไปยังเส้นทางที่ขึ้นต้นด้วย
    // เครื่องหมายทับหลายตัว อย่างไรก็ตามหากมีการเพิ่มแบบฟอร์มในหน้า 404 นั้น
    // ส่งกลับไปที่ URI เดียวกันซึ่งแสดงการเปลี่ยนเส้นทางแบบเปิด
    // ช่องโหว่ นอกจากนี้ Drupal 7 ยังแสดงหน้าเดียวกันสำหรับ
    // http://www.example.org/foo และ http://www.example.org////foo
    ถ้า (strpos($path, '//') === 0) {
      $เส้นทาง = '/' . ltrim($path, '/');
      $qs = $request->getQueryString();
      ถ้า ($qs) {
        $qs = '?' . $qs;
      }
      $event->setResponse(new CacheableRedirectResponse($request->getUriForPath($path) . $qs));
    }
  }

  /**
   * {@inheritdoc}
   */
  ฟังก์ชั่นคงที่สาธารณะ getSubscribedEvents () {
    $events[KernelEvents::REQUEST][] = ['เปลี่ยนเส้นทาง', 1,000];
    ส่งคืนเหตุการณ์ $;
  }

}

ถ้า $value เป็น Drupal เฉพาะ ตัวอย่างเช่น คุณได้รับจากเอนทิตี ให้ใช้ลำดับความสำคัญเริ่มต้นที่ 0 และตั้งค่าเอนทิตีเป็นการขึ้นต่อกันของแคช ในกรณีนี้ คุณต้องตั้งค่าส่วนหัวการตอบสนองเพื่อป้องกันไม่ให้เบราว์เซอร์แคชผลลัพธ์การเปลี่ยนเส้นทางสำหรับเส้นทางนี้ ใช้ LocalRedirectResponse สำหรับท้องถิ่นหรือ TrustedRedirectResponse สำหรับ URL ภายนอก ดูคำตอบที่ยอดเยี่ยมนี้ ปิดใช้งานแคชเพจสำหรับการตอบสนองการเปลี่ยนเส้นทาง

May  avatar
zw flag
สวัสดี @4k4 ฉันได้อัปเดตโพสต์ของฉันแล้ว สิ่งที่จะเกิดขึ้นคือหากผู้เยี่ยมชมไม่ได้ไปที่ MyModulePage เพื่อเปลี่ยนเส้นทางไปยัง MyModulePageอย่างไรก็ตามไม่มีอะไรเกิดขึ้น ขอบคุณ

โพสต์คำตอบ

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