Vâng, đây là một cách tiếp cận chính xác. Bạn không cần một tuyên bố khác. Nếu bạn không đặt phản hồi, quá trình lan truyền sự kiện sẽ không dừng lại và những người đăng ký sự kiện có mức độ ưu tiên thấp hơn sẽ có cơ hội đặt phản hồi. Mức độ ưu tiên phụ thuộc vào giá trị $. Câu hỏi của bạn không rõ ràng, nhưng nếu nó không phụ thuộc vào bất kỳ điều gì cụ thể của Drupal thì hãy đặt mức độ ưu tiên> 300.
Phương pháp hay nhất là sử dụng phản hồi có thể lưu trong bộ nhớ cache và thêm bất kỳ phần phụ thuộc nào của giá trị $ vào phản hồi. Nếu bạn không có thì vẫn sử dụng phản hồi này. Nó nói với Drupal rằng bạn ổn với việc nó được lưu trong bộ nhớ cache theo cách bạn muốn chuyển hướng đường dẫn này.
Ví dụ:
lõi/lib/Drupal/Core/EventSubscriber/RedirectLeadingSlashesSubscriber.php
<?php
không gian tên Drupal\Core\EventSubscriber;
sử dụng Drupal\Core\Cache\CacheableRedirectResponse;
sử dụng Symfony\Thành phần\HttpKernel\Sự kiện\RequestEvent;
sử dụng Symfony\Thành phần\HttpKernel\KernelEvents;
sử dụng Symfony\Component\EventDispatcher\EventSubscriberInterface;
/**
* Chuyển hướng các đường dẫn bắt đầu bằng nhiều dấu gạch chéo thành một dấu gạch chéo.
*/
lớp RedirectLeadingSlashesSubscriber triển khai EventSubscriberInterface {
/**
* Chuyển hướng các đường dẫn bắt đầu bằng nhiều dấu gạch chéo thành một dấu gạch chéo.
*
* @param \Symfony\Component\HttpKernel\Event\RequestEvent $event
* RequestEvent để xử lý.
*/
chuyển hướng chức năng công khai (RequestEvent $event) {
$request = $event->getRequest();
// Lấy đường dẫn yêu cầu trừ đi đường dẫn cơ sở.
$path = $request->getPathInfo();
// Không thể tạo liên kết hoặc định tuyến đến đường dẫn bắt đầu bằng
// nhiều dấu gạch chéo đầu. Tuy nhiên, nếu một biểu mẫu được thêm vào trang 404
// gửi lại cùng một URI, điều này thể hiện một chuyển hướng mở
// lỗ hổng. Ngoài ra, Drupal 7 hiển thị cùng một trang cho
// http://www.example.org/foo và http://www.example.org////foo.
if (strpos($path, '//') === 0) {
$path = '/' . ltrim($path, '/');
$qs = $request->getQueryString();
nếu ($qs) {
$qs = '?' . $qs;
}
$event->setResponse(new CacheableRedirectResponse($request->getUriForPath($path) . $qs));
}
}
/**
* {@inheritdoc}
*/
hàm tĩnh công khai getSubscribeEvents() {
$events[KernelEvents::REQUEST][] = ['chuyển hướng', 1000];
trả lại sự kiện $;
}
}
Nếu giá trị $ là dành riêng cho Drupal, chẳng hạn như bạn lấy nó từ một thực thể, hãy sử dụng mức độ ưu tiên mặc định là 0 và đặt thực thể đó làm phần phụ thuộc vào bộ đệm. Trong trường hợp này, bạn cần đặt các tiêu đề phản hồi để ngăn trình duyệt lưu vào bộ nhớ đệm kết quả chuyển hướng cho đường dẫn này. Sử dụng LocalRedirectResponse cho địa phương hoặc TrustedRedirectResponse cho các URL bên ngoài. Xem câu trả lời tuyệt vời này Vô hiệu hóa bộ đệm trang cho phản hồi chuyển hướng