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.