ฉันสามารถใช้ฟังก์ชัน / วิธีใดเพื่อเปลี่ยนเส้นทางผู้ใช้ไปยังหน้าอื่น


12

ใน Drupal 7 ฉันใช้รหัสต่อไปนี้

function my_goto($path) { 
  drupal_goto($path, array(), 301);
}

ฉันควรใช้รหัสใดใน Drupal 8


3
drupal.org/node/2023537เป็นบันทึกการเปลี่ยนแปลงสำหรับ drupal_goto () ทุกครั้งที่คุณมองหาการแทนที่ฟังก์ชั่นที่เฉพาะเจาะจงให้ดูที่นั่นก่อน
Berdir

คำตอบ:


24

นี่คือรหัสที่ควรใช้ใน Drupal 8 ดูการเปลี่ยนแปลงบันทึกสำหรับข้อมูลเพิ่มเติม

use Symfony\Component\HttpFoundation\RedirectResponse;

function my_goto($path) { 
  $response = new RedirectResponse($path);
  $response->send();
  return;
}

6
อย่าลืมเพิ่มuse Symfony\Component\HttpFoundation\RedirectResponse;
Matt Fletcher

นี่คือระดับต่ำรหัส HttpFoundation ไม่เหมาะในการประยุกต์ใช้ Symfony ดูsymfony.com/doc/current/components/...
user89751

8

เพื่อสร้างการตอบสนองของ Anu Mathew ;

ในการเพิ่มรหัสสถานะเป็นเพียงพารามิเตอร์ตัวที่สองในคลาส RedirectResponse

use Symfony\Component\HttpFoundation\RedirectResponse;

function my_goto($path) { 
  $response = new RedirectResponse($path, 302);
  $response->send();
  return;
}

1
สำหรับฉันนี้ดูเหมือนว่าจะทำงานเพียงครั้งเดียวและต้องล้างแคชทุกครั้งที่คุณต้องการให้มันทำงานอีกครั้ง มีวิธีแก้ไขไหม?
แมตต์


4

ฉันไม่ได้ทำงานใน drupal 8 แต่ตามเอกสารdrupal_gotoถูกลบออกจาก Drupal 8

ในสถานที่ที่drupal_gotoคุณต้องเขียน:

return new RedirectResponse(\Drupal::url('route.name'));

และบางสิ่งเช่นนี้พร้อมพารามิเตอร์:

return new RedirectResponse(\Drupal::url('route.name', [], ['absolute' => TRUE]));

ตรวจสอบที่นี่https://www.drupal.org/node/2023537และคลาส RedirectResponse


ขอบคุณสำหรับการตอบกลับของคุณ แต่ฉันจะได้รับชื่อเส้นทางจาก URL ปัจจุบันได้อย่างไร (เพราะ url กำลังตั้งค่าโดยใช้แบบฟอร์มการกำหนดค่า)
Anu Mathew

คุณหมายถึงเส้นทางการเปลี่ยนเส้นทางเป็นแบบไดนามิก ???
สุมิตรมาน

ใช่สิทธิของคุณเป็นแบบไดนามิก ..
Anu Mathew

โอเคลองแทนที่\Drupal::url('route.name')ด้วย URL ของคุณหรืออาจเป็น URL แบบสัมบูรณ์
สุมิตรมาน

ส่งคืน RedirectResponse ใหม่ ($ absolute_url); ทำงานได้สำหรับฉัน :) แต่มันแสดงข้อความ "เปลี่ยนเส้นทางไปที่example.com/absolute_url " บนหน้าจอ
Anu Mathew

4

สิ่งนี้สามารถทำได้โดยการใช้ประโยชน์จาก Symphonies ในตัว EventDispatcher Component สิ่งที่คุณต้องทำคือสร้างโมดูลที่กำหนดเอง เพิ่มไฟล์ services.yml ของคุณและกำหนดค่าบริการที่เหมาะสม

services:
  mymodue.subscriber:
    class: Drupal\my_module\EventSubscriber
    tags:
      - { name: event_subscriber }

ในไดเรกทอรีโมดูล src ของคุณเพิ่มสร้างคลาส EventSubscriber.php และอธิบายวิธีการของคุณที่นี่

    <?php
       use Symfony\Component\HttpFoundation\RedirectResponse;

        public function checkForCustomRedirect(GetResponseEvent $event) {     
            $route_name = \Drupal::request()->attributes->get(RouteObjectInterface::ROUTE_NAME);
            if($route_name === 'module.testPage') {
              $event->setResponse(new RedirectResponse($url, $status = 302,$headers);
            }
         }

          /**
           * {@inheritdoc}
           */
        public static function getSubscribedEvents() {
            $events = [];
            $events[KernelEvents::REQUEST][] = array('checkForCustomRedirect');
            return $events;
        }

ไม่ได้กำหนด $ url
Dan Shumaker

1

รหัสเปลี่ยนเส้นทางที่ทำงานอย่างสมบูรณ์แบบสำหรับฉันมีดังต่อไปนี้:

$response = new RedirectResponse($path);
return $response->send();

ในกรณีอื่น ๆ ฉันได้รับข้อยกเว้นหรือข้อผิดพลาดบางอย่างตัวอย่างเช่น: LogicException: ตัวควบคุมจะต้องตอบกลับ ...

หรือ

https://www.drupal.org/project/drupal/issues/2852657

มีการสนทนาเกี่ยวกับเรื่องนี้อยู่แล้วหวังว่าจะช่วยได้!


0

สิ่งนี้ใช้ได้สำหรับการเปลี่ยนเส้นทางภายในหรือภายนอก:

use Symfony\Component\HttpFoundation\RedirectResponse;
use Drupal\Core\Url;

   $url = Url::fromUri('internal:/node/27'); // choose a path
   // $url =  Url::fromUri('https://external_site.com/');
    $destination = $url->toString();
    $response = new RedirectResponse($destination, 301);
    $response->send();
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.