web-dev-qa-db-fra.com

KernelEvents :: REQUEST n'est pas déclenché sur les pages en cache

J'essaie d'implémenter un abonné d'événement KernelEvents :: REQUEST pour effectuer une action sur le chargement de la page.

J'ai besoin que cet événement se déclenche, que la page demandée existe ou non dans le cache Drupal - il semble que KernelEvents :: REQUEST ne se déclenche pas lorsque Drupal sert quelque chose) du cache.

Y a-t-il un événement que je peux utiliser pour y parvenir, ou dois-je implémenter mes exigences en tant que middleware?

13
user34185

Le cache dynamique souscrit un événement avec la priorité 27. Si vous voulez que votre code s'exécute avant cela, vous devez utiliser une priorité> 27:

  public static function getSubscribedEvents() {
    $events = [];

    // Run after AuthenticationSubscriber (necessary for the 'user' cache
    // context; priority 300) and MaintenanceModeSubscriber (Dynamic Page Cache
    // should not be polluted by maintenance mode-specific behavior; priority
    // 30), but before ContentControllerSubscriber (updates _controller, but
    // that is a no-op when Dynamic Page Cache runs; priority 25).
    $events[KernelEvents::REQUEST][] = ['onRequest', 27];

Qui s'exécute DynamicPageCacheSubscriber :: onRequest ..

13
4k4

Drupal 8 a un cache à deux niveaux, un cache de page et un cache de page dynamique.

Oui, vous pouvez intercepter le cache de page dynamique comme mentionné @ 4k4. Le problème que vous rencontrez est plus susceptible d'intercepter le cache de pages. La clé est dans ici .

Il existe quelques solutions pour cela:

  1. Ajoutez une nouvelle classe qui implémente 'HttpKernelInterface' et enregistrez 'http_middleware' avec une priorité supérieure à 200 (280 suffira). Voir la classe 'PageCache' et les implémentations pour les références.

  2. Créez une nouvelle classe pour modifier le "PageCache" existant en l'étendant à partir de "ServiceProviderBase". Vérifiez cela pour les références ici . Ensuite, créez une nouvelle classe pour étendre le "PageCache".

Voici les références de code:

Il s'agit de StaticCacheServiceProvider.php:

/**
 * Modifies the language manager service.
 */
class StaticCacheServiceProvider extends ServiceProviderBase
{
  /**
   * {@inheritdoc}
   */
  public function alter(ContainerBuilder $container)
  {
    // Overrides language_manager class to test domain language negotiation.
    $definition = $container->getDefinition('http_middleware.page_cache');
    $definition->setClass('Drupal\your_module\StackMiddleware\StaticCache');
  }
}

Voici StaticCache.php:

/**
 * Executes the page caching before the main kernel takes over the request.
 */
class StaticCache extends PageCache
{
  /**
   * {@inheritdoc}
   */
  public function handle(Request $request, $type = self::MASTER_REQUEST, $catch = true)
  {
    // do special logic here.

    $response = parent::handle($request, $type, $catch);

    return $response;
  }
}

L'espoir aide.

6
kororo