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?
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?
Câu trả lời:
Đâ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;
}
use Symfony\Component\HttpFoundation\RedirectResponse;
Để 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;
}
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_goto
bạ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/2023537 và lớp RedirectResponse
\Drupal::url('route.name')
bằng url của bạn hoặc có lẽ là url tuyệt đối.
Đ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;
}
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!
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();