Tôi có thể sử dụng chức năng / phương pháp nào để chuyển hướng người dùng đến một trang khác?


11

Trong Drupal 7, tôi sử dụng đoạn mã sau.

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

Tôi nên sử dụng mã nào trong Drupal 8?


3
drupal.org/node/2023537 là bản ghi thay đổi cho drupal_goto (), bất cứ khi nào bạn đang tìm kiếm một sự thay thế cho một chức năng cụ thể, trước tiên hãy xem ở đó.
Berdir

Câu trả lời:


23

Đây là mã nên được sử dụng trong Drupal 8. Xem Bản ghi thay đổi để biết thêm.

use Symfony\Component\HttpFoundation\RedirectResponse;

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

6
Đừng quên thêmuse Symfony\Component\HttpFoundation\RedirectResponse;
Matt Fletcher

Đây là mã httpFoundation cấp thấp không phù hợp trong ứng dụng Symfony, xem symfony.com/doc/civerse/components/ ,.
dùng89751

8

Để xây dựng dựa trên phản ứng của Anu Mathew ;

Để thêm mã trạng thái, nó chỉ là tham số thứ hai trong lớp RedirectResponse;

use Symfony\Component\HttpFoundation\RedirectResponse;

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

1
Đối với tôi điều này dường như chỉ hoạt động một lần và phải xóa bộ nhớ cache mỗi khi bạn muốn nó hoạt động trở lại. Có cách nào xung quanh đó không?
Matt


4

Tôi đã không làm việc trong drupal 8 nhưng theo tài liệu drupal_gotođược xóa khỏi Drupal 8.

Thay vào đó drupal_gotobạn cần viết:

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

và một cái gì đó như thế này với các tham số:

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

Kiểm tra tại đây https://www.drupal.org/node/2023537lớp RedirectResponse


Cảm ơn câu trả lời của bạn. Nhưng làm cách nào tôi có thể nhận được tên tuyến đường từ url hiện tại (Vì url được đặt bằng hình thức cấu hình)
Anu Mathew

Bạn có nghĩa là đường dẫn chuyển hướng là năng động ???
Sumit Madan

Vâng, quyền của bạn là năng động ..
Anu Mathew

Ok cố gắng thay thế \Drupal::url('route.name')bằng url của bạn hoặc có lẽ là url tuyệt đối.
Sumit Madan

trả lại RedirectResponse mới ($ perfect_url); được làm việc cho tôi :) Nhưng nó hiển thị thông báo "redirect to example.com/absolute_url " trên màn hình
Anu Mathew

4

Điều này có thể đạt được bằng cách tận dụng các bản giao hưởng tích hợp Thành phần EventDispatcher. Tất cả bạn phải làm là tạo ra một mô-đun tùy chỉnh. Thêm tệp services.yml của bạn và cung cấp cấu hình dịch vụ phù hợp.

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

trong thư mục src mô-đun của bạn thêm tạo lớp EventSubscacker.php của bạn và mô tả cho bạn các phương thức ở đây.

    <?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 không được xác định.
Dan Shumaker

1

Mã chuyển hướng làm việc hoàn hảo cho tôi là như sau:

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

Trong mọi trường hợp khác, tôi nhận được một số loại ngoại lệ hoặc lỗi, ví dụ: LogicException: Bộ điều khiển phải trả về phản hồi ...

HOẶC LÀ

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

Đã có một cuộc thảo luận về nó, hy vọng rằng sẽ giúp!


0

cái này hoạt động để chuyển hướng bên trong hoặc bên ngoài:

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();
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.