it-swarm.com.de

Cache in der Hook-Vorverarbeitungsseite

Ich versuche, einen Wert der GET-Variablen in hook_preprocess_page() abzurufen, habe jedoch Probleme mit dem Cache. Erst wenn der Code zum ersten Mal ausgeführt wird, kann ich den Wert der Variablen abrufen, um ihn in ein Cookie einzufügen. Wenn ich versuche, dieselbe Seite mit unterschiedlichen Werten zu laden, wird der Code nicht ausgeführt.

Ich muss diesen Wert in ein Cookie setzen, um die Quelle der Leads zu identifizieren.

4
javiregpa

Wenn Ihr Vorprozess das Ergebnis der Seite nicht beeinflusst und ausgeführt werden muss, auch wenn die Seite aus dem Seitencache bereitgestellt wird, sollten Sie Ihre Logik auf einen Kernel Event-Abonnenten verschieben, der hook_boot() und hook_exit() von Drupal 7.

DrupalizeMe hat einen Artikel über Ereignisabonnenten , aber die grundlegenden Komponenten erstellen eine Klasse, die EventSubscriberInterface implementiert, und registrieren sie dann als Dienst.

MYMODULE/EventSubscriber/MyEventSubscriber.php

class MyEventSubscriber implements EventSubscriberInterface {
  static function getSubscribedEvents() {
    $events[KernelEvents::RESPONSE][] = ['onResponse'];
    return $events;
  }
  public function onResponse(FilterResponseEvent $event) {
    $request = $event->getRequest();
    $response = $event->getResponse();

    $parameter_value = $request->query->get('parameter_name');
    $response->headers->setCookie(new Cookie('cookie_name', 'cookie_value'));
  }
}

MYMODULE/MYMODULE.services.yml

MYMODULE.my_event_subscriber:
  class: Drupal\MYMODULE\EventSubscriber\MyEventSubscriber
  arguments: []
  tags:
    - { name: event_subscriber }

Das Anforderungsereignis kann die Anforderung ändern, bevor andere Komponenten sie empfangen, die Antwort jedoch nicht beeinflussen. Das Antwortereignis kann die Anforderung nicht ändern, kann jedoch die Antwort ändern, nachdem sie erstellt wurde.
Wenn Sie beides tun müssen, kann Ihr Serviceobjekt während des Anforderungsereignisses einen Status speichern und dann die Antwort basierend auf diesem Status während des Antwortereignisses ändern.

4
gapple

Um den Cache in einem Vorverarbeitungs-Hook in Drupal 8) zu sprengen, können Sie einfach den gewünschten Cache-Kontext zum $variables. Im folgenden Beispiel wird Ihr Code jetzt pro Sitzung zwischengespeichert.

/**
 * Implements template_preprocess_page().
 */
function MYMODULE_preprocess_page(&$variables) {

  // Your code ...
  // ...
  // ...

  // Ensure the cache varies correctly.
  $variables['#cache']['contexts'][] = 'session';
}

Lesen Sie die Dokumente für weitere verfügbare Kontexte: Cache-Kontexte .


Alternativ können Sie ein eigenes Tag festlegen, wie es in einer ähnlichen Frage beantwortet wurde: Cache in hook_preprocess_node entfernen

1
leymannx

Wenn Sie den Cache in hook_preprocess_hook deaktivieren möchten, können Sie Variablen einfach ein Cache-Element hinzufügen. Beispiel:

function MYMODULE_preprocess_page(&$variables) {
  // prevent caching certain element
  $variables['my_custom_element'] = [
    '#markup' => t('My message'),
    '#cache' => ['max-age' => 0],
  ];
  // or prevent caching all page
  $variables['#cache']['max-age'] = 0;
}
1
Para-Diz