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?

Anu Mathew
sumber
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;
}
Anu Mathew
sumber
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;
}
Kristen
sumber
1
Bagi saya ini sepertinya hanya berfungsi sekali, dan harus cache dibersihkan setiap kali Anda ingin itu berfungsi lagi. Apakah ada jalan keluarnya?
Matt
@Matt See drupal.stackexchange.com/a/222700/14151
Matt Fletcher
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

Sumit Madan
sumber
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;
        }
Jay Chand
sumber
$ 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!

Junkuncz
sumber
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();
Matoeil
sumber