Site icon Blog ARC Optimizer

Alter Page Cache pour l’utilisation de cookies dans Drupal 9

Alter Page Cache pour l’utilisation de cookies dans Drupal 9


Pour modifier le comportement de la mise en cache des pages, nous devons comprendre les concepts Drupal Core suivants, mentionnés ci-dessous.

  • Cache interne des pages (\Drupal\page_cache\StackMiddleware\PageCache): Dans Drupal, la mise en cache des pages internes fait référence à un mécanisme de mise en cache intégré qui met en cache l’intégralité de la sortie HTML des pages rendues.
  • Négociation de contenu (\Drupal\Core\StackMiddleware\NégociationMiddleware): La négociation de contenu est utilisée pour fournir la réponse dans le format préféré demandé par le client, qui peut être HTML, JSON, XML ou d’autres formats.
  • Gestion des sessions (\Drupal\Core\StackMiddleware\Session): La gestion de session est utilisée pour stocker et maintenir des informations spécifiques à l’utilisateur sur le site.

Commençons par un exemple :

Problème: La page de vue est mise en cache lors de l’utilisation de cookies comme filtre contextuel.

Solution: Ajoutons des cookies en fonction de l’emplacement (Mumbai, Delhi, etc.). Si nous voulons modifier la mise en cache de la page en fonction de la valeur du cookie, à savoir Mumbai, Delhi, etc., nous commencerons à créer un plug-in de vue personnalisé pour récupérer la valeur des cookies et transmettre des données dans les vues en tant qu’argument. Pour résoudre, la page de vue est mise en cache lors de l’utilisation de cookies comme filtre contextuel, nous pouvons modifier le cache de page et définir notre valeur de cookies dynamiques avec l’identifiant de cache de page. Ainsi, dans ce blog, nous verrons comment nous pouvons ajouter de la valeur de cookies au cache de la page en utilisant les intergiciels Drupal StackPHP et ServiceProvider.

Ici, nous étendons la classe de cache de page interne et utilisons ses méthodes prédéfinies selon nos besoins. Avant d’étendre la classe Page Cache, nous devons créer un fournisseur de services personnalisé en étendant la classe Drupal Core Service Provide Base et l’interface de fournisseur de services dans notre module personnalisé.

Premièrement, Drupal ne découvre automatiquement qu’un seul fournisseur de services par module Drupal. Implémentez une classe étendant ServiceProviderBase et la méthode alter() pour modifier les services existants. La convention de dénomination pour la classe PHP du fournisseur de services est le nom du module Drupal en casse camel plus ServiceProvider.php. Vous ne pouvez pas nommer la classe de fournisseur de services, juste ServiceProvider.php. Ce doit être [MODULE-NAME-CAMEL-CASE]ServiceProvider.php. Nous allons donc créer le fichier customCommonServiceProvider.php dans notre module personnalisé. Ce fichier a été placé dans /web/modules/custom/customCommon/src/customCommonServiceProvider.php

Comprenons cela avec le code ci-dessous.

<?php 

namespace Drupal\customCommon; 

use Drupal\Core\DependencyInjection\ContainerBuilder; 
use Drupal\Core\DependencyInjection\ServiceProviderBase; 
use Drupal\Core\DependencyInjection\ServiceProviderInterface; 

/** 
 * Alter page cache service. 
 */ 
class customCommonServiceProvider extends ServiceProviderBase implements ServiceProviderInterface { 

  /** 
   * {@inheritdoc} 
   */ 
  public function alter(ContainerBuilder $container) { 
    if ($container->hasDefinition('http_middleware.page_cache')) {
      $definition = $container->getDefinition('http_middleware.page_cache');
      $definition->setClass('Drupal\customCommon\StackMiddleware\AlterPageCache');
    }
  }

Dans le code ci-dessus, nous étendons la classe principale ServiceProviderBase et ServiceProviderInterface. Nous appelons la méthode alter avec ContainerBuilder comme argument. Dans le conteneur, nous vérifions l’existence de la définition du cache de la page du middleware. Ensuite, nous obtiendrons et définirons notre classe AlterPageCache dedans.

Deuxièmement, nous allons créer un dossier StackMiddleware dans le dossier src de notre module personnalisé. Dans ce dossier, nous devons créer un fichier AlterPageCache.php. Ainsi, le chemin final du fichier sera /web/modules/custom/customCommon/src/StackMiddleware/AlterPageCache.php

<?php

namespace Drupal\customCommon\StackMiddleware;

use Drupal\page_cache\StackMiddleware\PageCache;
use Symfony\Component\HttpFoundation\Request;

/**
 * Alter page cache service and extend Cookies.
 */
class AlterPageCache extends PageCache {

  /**
   * Get cookie id cached.
   */
  protected function getCacheId(Request $request) {
    // Get cookie value and append into cid.
    $cookiesCache = $request->cookies->get('currentLocation', NULL);
    if (!isset($this->cid)) {
      $cidParts = [
        $request->getSchemeAndHttpHost() . $request->getRequestUri(),
        $request->getRequestFormat(NULL),
        $cookiesCache,
      ];
      $this->cid = implode(':', $cidParts);
    }
    return $this->cid;
  }

}

Dans ce fichier, nous étendons la classe de cache de page interne et remplaçons sa méthode getCacheId pour définir les cookies que nous obtenons de la requête et renvoyons l’ID de cache.

Conclusion: En suivant les étapes ci-dessus, on peut modifier la mise en cache de la page en fonction d’une valeur de cookie personnalisée. Faites-nous savoir en cas de questions; n’hésitez pas à nous contacter via les commentaires et à vous abonner à nos blogs.

TROUVÉ CELA UTILE ? PARTAGEZ-LE




Source link
Quitter la version mobile