Fungsi / metode apa yang dapat saya gunakan untuk mengarahkan pengguna ke halaman lain?


11

Di Drupal 7, saya menggunakan kode berikut.

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

Kode apa yang harus saya gunakan di Drupal 8?


3
drupal.org/node/2023537 adalah catatan perubahan untuk drupal_goto (), setiap kali Anda mencari pengganti untuk fungsi tertentu, lihat di sana terlebih dahulu.
— Berdir

Jawaban:


24

Ini adalah kode yang harus digunakan dalam Drupal 8. Lihat perubahan Record untuk info lebih lanjut.

use Symfony\Component\HttpFoundation\RedirectResponse;

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

6
Jangan lupa untuk menambahkanuse Symfony\Component\HttpFoundation\RedirectResponse;
— Matt Fletcher

Ini adalah kode HttpFoundation tingkat rendah yang tidak cocok dalam aplikasi Symfony, lihat symfony.com/doc/current/components/… .
— user89751

8

Untuk membangun di atas tanggapan Anu Mathew ;

Untuk menambahkan kode status, ini hanya param kedua di kelas RedirectResponse;

use Symfony\Component\HttpFoundation\RedirectResponse;

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

1
Bagi saya ini sepertinya hanya berfungsi sekali, dan harus cache dibersihkan setiap kali Anda ingin itu berfungsi lagi. Apakah ada jalan keluarnya?
— Matt


4

Saya belum bekerja di drupal 8, tetapi karena dokumentasinya drupal_gotodihapus dari Drupal 8.

Di tempat drupal_gotoAnda perlu menulis:

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

dan sesuatu seperti ini dengan parameter:

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

Periksa di sini https://www.drupal.org/node/2023537 dan kelas RedirectResponse


Terima kasih atas balasan Anda. Tetapi bagaimana saya bisa mendapatkan nama rute dari url saat ini (Karena url diatur menggunakan formulir konfigurasi)
— Anu Mathew

Maksudmu jalur pengalihan itu dinamis ???
— Sumit Madan

Ya, kanannya dinamis ..
— Anu Mathew

Ok coba ganti \Drupal::url('route.name')dengan url Anda atau mungkin url absolut.
— Sumit Madan

kembalikan RedirectResponse baru ($ absolute_url); bekerja untuk saya :) Tetapi menampilkan pesan "redirect to example.com/absolute_url " di layar
— Anu Mathew

4

Ini dapat dicapai dengan memanfaatkan Komponen EventDispatcher simfoni bawaan. Yang harus Anda lakukan adalah membuat modul khusus. Tambahkan file services.yml Anda dan berikan konfigurasi layanan yang sesuai.

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

di direktori modul src Anda tambahkan buat kelas EventSubscriber.php Anda dan jelaskan metode Anda di sini.

    <?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 tidak ditentukan.
— Dan Shumaker

1

Kode pengalihan yang berfungsi dengan baik untuk saya adalah sebagai berikut:

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

Dalam kasus lain saya mendapatkan semacam pengecualian atau kesalahan, misalnya: LogicException: Pengontrol harus mengembalikan respons ...

ATAU

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

Sudah ada diskusi tentang itu, semoga bisa membantu!


0

ini berfungsi untuk pengalihan internal atau eksternal:

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();
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.