Thay thế cho drupal_add_http_header () [đã đóng]


7

Tôi có một mô-đun tùy chỉnh về cơ bản là các API, do đó yêu cầu các tiêu đề như kiểu nội dung được thêm vào các phản hồi. Tôi đã sử dụng drupal_add_http_header()trong Drupal 7, nhưng nó dường như không được dùng trong 8. Có sự thay thế nào không?

Tôi đã đọc về nó trên trang web Drupal nói về Phản hồi của đối tượng Symfony, nhưng tôi cũng không thể sử dụng nó.


Như bạn đã đề cập, đối tượng Phản hồi Symfony là sự thay thế của D8 để sử dụng drupal_add_http_header. Bạn nên giải quyết lý do tại sao bạn không thể sử dụng nó.
Shawn Conn

Vì nó yêu cầu tôi chuyển một đối tượng phản hồi cho hàm rồi. Tôi có thể đạt được điều tương tự bằng cách sử dụng chức năng tiêu đề của php không?
Hemant Kumar Goyalty

Chào mừng đến với câu trả lời của Drupal! Bạn nên hiển thị mã bạn đang sử dụng và cung cấp thêm chi tiết. Ví dụ, từ mô tả của bạn không rõ ràng nếu bạn đang sử dụng bộ điều khiển hay cái gì, và nhận xét của bạn hơi khó hiểu. Tại sao sẽ vượt qua một đối tượng phản hồi cho một chức năng? Bạn trả lại nó cho Drupal là đủ, nhưng không thấy bất kỳ mã nào, không thể cho bạn biết mã bạn nên sử dụng.
kiamlaluno

Tôi tìm thấy một chủ đề thảo luận từ www.drupal.org có thể điều này có thể giúp ích được rất ít. 1. drupal.org/node/2307723 . 2. drupal.org/node/2467759 .
Shreya Shetty

Bạn có thể sử dụng $build['#attached']['http_header']để thêm một tiêu đề tùy chỉnh.
kenorb

Câu trả lời:


10

Nếu bạn muốn sửa đổi các tiêu đề của phản hồi, bạn cần sử dụng Trình đăng ký sự kiện. Symphony không có hệ thống hook mà thay vào đó sử dụng hệ thống phát / sự kiện. Vì Symphony điều khiển chu kỳ yêu cầu / phản hồi, về cơ bản bạn cần tích hợp với Symphony để thực hiện điều này.

Bạn có thể xem \Drupal\Core\EventSubscriber\FinishResponseSubscriberđể xem làm thế nào được thực hiện, ý chính của nó là:

/**
 * Add custom headers.
 */
class HeaderResponseSubscriber implements EventSubscriberInterface {
  public function onRespond(FilterResponseEvent $event) {
    $response = $event->getResponse();
    $response->headers->set('Some-Header', 'some value'); 
  }

  public static function getSubscribedEvents() {
    $events[KernelEvents::RESPONSE][] = array('onRespond');
    return $events;
  }
}

Lưu ý trong đoạn mã trên, tất cả các câu lệnh sử dụng đã được loại trừ, bạn cũng cần phải đăng ký lớp của mình dưới dạng dịch vụ event_subscacker, điều này được thực hiện trong module_name.services.ymltệp mô-đun của bạn như sau:

services:
  name_of_service:
    class: Drupal\Full\Namespaced\Path\To\Class
    tags:
      - { name: event_subscriber }

Bạn có thể thêm các đối số (các dịch vụ khác) mà lớp của bạn sẽ phụ thuộc vào tệp dịch vụ như bình thường.


6
Câu trả lời tốt, nhưng đáng nói là bạn chỉ cần điều này nếu bạn cần thay đổi / mở rộng câu trả lời do người khác tạo ra. Nếu bạn trả lại phản hồi cho mình, chỉ cần gọi trực tiếp các phương thức đó. Và nếu bạn muốn làm điều đó như một phần của thứ gì đó trả về mảng kết xuất (khối, trường, bất cứ thứ gì), bạn có thể sử dụng #attached: $build['#attached']['http_header'][] = [['Content-Type', 'application/rss+xml; charset=utf-8']];(ví dụ là từ \Drupal\Core\Render\AttachmentsResponseProcessorInterface::processAttachments)
Berdir

2
Một ví dụ khác có thể được tìm thấy tại: Chapterthree.com/blog/how-to-register-event-subscacker-drupal8
gerzenstl
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.