Ersatz für drupal_add_http_header () [geschlossen]

7

Ich habe ein benutzerdefiniertes Modul, bei dem es sich im Grunde um APIs handelt. Daher müssen den Antworten Header wie der Inhaltstyp hinzugefügt werden. Ich habe drupal_add_http_header()in Drupal 7 verwendet, aber es scheint in 8 veraltet zu sein. Gibt es einen Ersatz?

Ich habe auf der Drupal-Website darüber gelesen und über Symfony-Objektantwort gesprochen, aber ich kann das auch nicht verwenden.

Hemant Kumar Goyal
quelle
Wie Sie bereits erwähnt haben, ist das Symfony Response-Objekt der Ersatz von D8 für die Verwendung von drupal_add_http_header. Sie sollten angeben, warum Sie es nicht verwenden können.
Shawn Conn
Da muss ich schon ein Antwortobjekt an die Funktion übergeben. Kann ich dasselbe erreichen, indem ich die Header-Funktion von PHP verwende?
Hemant Kumar Goyal
Willkommen bei Drupal Answers! Sie sollten den von Ihnen verwendeten Code anzeigen und weitere Details angeben. Aus Ihrer Beschreibung geht beispielsweise nicht hervor, ob Sie einen Controller verwenden oder was, und Ihr Kommentar ist etwas verwirrend. Warum sollte ein Antwortobjekt an eine Funktion übergeben werden? Es reicht aus, wenn Sie es an Drupal zurückgeben, aber ohne Code zu sehen, ist es nicht möglich, Ihnen den Code mitzuteilen, den Sie verwenden sollten.
Kiamlaluno
Ich habe einen Diskussionsthread von www.drupal.org gefunden, der möglicherweise wenig hilfreich ist. 1. drupal.org/node/2307723 . 2. drupal.org/node/2467759 .
Shreya Shetty
Sie können $build['#attached']['http_header']einen benutzerdefinierten Header hinzufügen.
Kenorb

Antworten:

10

Wenn Sie die Header einer Antwort ändern möchten, müssen Sie einen EventSubscriber verwenden. Symphony hat kein Hook-System, sondern ein Event / Emitter-System. Da es Symphony ist, das den Anforderungs- / Antwortzyklus steuert, müssen Sie sich grundsätzlich in Symphony integrieren, um dies zu tun.

Sie könnten einen Blick darauf werfen, um \Drupal\Core\EventSubscriber\FinishResponseSubscriberzu sehen, wie dies gemacht wird. Der Kern davon ist folgender:

/**
 * 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;
  }
}

Beachten Sie, dass im obigen Code alle Verwendungsanweisungen ausgeschlossen wurden. Außerdem müssen Sie Ihre Klasse als event_subscriber-Dienst registrieren. Dies erfolgt in der module_name.services.ymlDatei Ihres Moduls wie folgt :

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

Sie können in der Servicedatei wie gewohnt Argumente (andere Dienste) hinzufügen, von denen Ihre Klasse abhängt.

googletorp
quelle
6
Gute Antwort, aber erwähnenswert, dass Sie dies nur benötigen, wenn Sie die von jemand anderem erstellten Antworten ändern / erweitern müssen. Wenn Sie die Antwort selbst zurückgeben, rufen Sie diese Methoden einfach direkt auf. Und wenn Sie es als Teil von etwas tun möchten, das ein Render-Array zurückgibt (einen Block, ein Feld, was auch immer), können Sie #attached verwenden: $build['#attached']['http_header'][] = [['Content-Type', 'application/rss+xml; charset=utf-8']];(Beispiel ist von \Drupal\Core\Render\AttachmentsResponseProcessorInterface::processAttachments)
Berdir
2
Ein weiteres Beispiel finden Sie unter: kapitelthree.com/blog/how-to-register-event-subscriber-drupal8
gerzenstl