API de Caché

Categoría: API de Caché

Adjuntar contextos de caché mediante CacheableMetadata en un servicio

Cómo adjuntar contextos de caché a una array renderizado utilizando CacheableMetadata en un servicio personalizado.
Adjuntar contextos de caché mediante CacheableMetadata en un servicio
              

namespace Drupal\my_module\Service;
use Drupal\Core\Cache\CacheableMetadata;

class MyDataService {
   public function buildData(): array {
      $build = [
         '#markup' => 'Dynamic data output.',
      ];
      $cache_metadata = new CacheableMetadata();
      $cache_metadata->setCacheContexts(['route', 'user.roles']);
      $cache_metadata->applyTo($build);
      return $build;
   }
}
 


Alteración de una vista para añadir contextos de caché

Define hook_entity_view_alter() para añadir un contexto de caché adicional (permisos de usuario).
Alteración de una vista para añadir contextos de caché
              

/**
* Implements hook_entity_view_alter() to add cache contexts.
*/
function my_module_entity_view_alter(array &$build, \Drupal\Core\Entity\EntityInterface $entity, \Drupal\Core\Entity\Display\EntityViewDisplayInterface $display, $view_mode) {
   $build['#cache']['contexts'][] = 'user.permissions';
}
 


Anular la caché mediante inyección de dependencias

Cómo anular los metadatos de caché por defecto para una respuesta JSON utilizando la inyección de dependencia.
Anular la caché mediante inyección de dependencias
              

namespace Drupal\my_module\Controller;
use Drupal\Core\Controller\ControllerBase;
use Drupal\Core\Ajax\CacheableJsonResponse;
use Drupal\Core\Cache\CacheableMetadata;
use Symfony\Component\DependencyInjection\ContainerInterface;
 

/**
* Returns a JSON response with overridden cache metadata.
*/
class OverrideCacheController extends ControllerBase {
   /**
    * {@inheritdoc}
    */
   public static function create(ContainerInterface $container) {
      return new static();
   }

   public function overrideCache(): CacheableJsonResponse {
      $data = [
         'content' => $this->t('Response with overridden cache metadata.'),
      ];
      $response = new CacheableJsonResponse($data);
      $cache_metadata = new CacheableMetadata();
      $cache_metadata->setCacheTags(['override_tag']);
      $cache_metadata->setCacheContexts(['user.uid']);
      $cache_metadata->setCacheMaxAge(0); // Non-cacheable
      $response->addCacheableDependency($cache_metadata);
      return $response;
   }
}
 


Array renderizable con metadatos de caché

Cómo añadir contextos de caché, etiquetas y max-age a un array de renderizable.
Array renderizable con metadatos de caché
              

/**
* Render array with Cache API metadata.
*/
$form = [];
$form['content'] = [
   '#markup' => 'Hello World',
   '#cache' => [
      'contexts' => ['user.permissions'],
      'tags' => ['node_list'],
      'max-age' => 3600,
   ],
];
return $form;
 


Array renderizado con contextos de caché

Cómo añadir contextos de caché a un array de renderizado para que varíe según los roles de usuario.
Array renderizado con contextos de caché
              

$build = [
   '#markup' => 'Hello, world!',
   '#cache' => [
      'contexts' => ['user.roles'],
   ],
];
return $build;
 


Bloquear plugin con metadatos de caché

Bloque personalizado que define metadatos de caché para su salida de renderizado.
Bloquear plugin con metadatos de caché
              

/**
* Provides a 'CachedContentBlock' block.
* @Block annotation is assumed to be defined in the plugin YAML.
*/
use Drupal\Core\Block\BlockBase;

class CachedContentBlock extends BlockBase {
   /**
   * {@inheritdoc}
   */
   public function build(): array {
      $build = [
         '#markup' => $this->t('This content is cached.'),
         '#cache' => [
            'contexts' => ['url.path'],
            'tags' => ['my_module_block'],
            'max-age' => 600,
         ],
      ];
      return $build;
   }
}
 


Invalidación de caché basado en etiquetas

Cómo invalidar datos almacenados en caché utilizando etiquetas de caché.
Invalidación de caché basado en etiquetas
              

/**
* Invalidate cache entries tagged with 'my_module_tag'.
*/
\Drupal::cache()->invalidateTags(['my_module_tag']);
 


Obtención y configuración básica de la caché

Cómo obtener y establecer datos en la caché utilizando un ID de caché único.
Obtención y configuración básica de la caché
              

/**
* Basic example of using the Cache API to get and set data.
*/
namespace Drupal\my_module;

use Drupal\Core\Cache\Cache;

$cid = 'my_module:unique_cache_id';
$cache = \Drupal::cache()->get($cid);
if ($cache) {
   $data = $cache->data;
} else {
   $data = 'result of expensive processing';
   \Drupal::cache()->set($cid, $data, Cache::PERMANENT);
}
 


Plugin de contexto de caché personalizado

Define un plugin de contexto de caché personalizado que devuelve la hora actual. (Asegúrate de que tu objeto es serializable).
Plugin de contexto de caché personalizado
              

namespace Drupal\my_module\Cache\Context;


use Drupal\Core\Cache\Context\CacheContextInterface;
use Drupal\Core\Cache\CacheableMetadata;

/**
* Provides a custom cache context based on the current hour.
*
* @CacheContext(
* id = "my_custom_time",
* label = @Translation("Custom Time Cache Context")
* )
*/

class MyCustomTimeCacheContext implements CacheContextInterface {
   public function getContext(): string {
      return date('H');
   }

   public function getCacheableMetadata(): CacheableMetadata {
      return new CacheableMetadata();
   }
}
 


Respuesta JSON almacenable en caché desde un controlador

Devuelve una respuesta JSON almacenable en caché con metadatos de caché personalizados (etiquetas, contextos y max-age).
Respuesta JSON almacenable en caché desde un controlador
              

namespace Drupal\my_module\Controller;
use Drupal\Core\Controller\ControllerBase;
use Drupal\Core\Cache\CacheableMetadata;
use Drupal\Core\Ajax\CacheableJsonResponse;


class MyController extends ControllerBase {
   /**
    * Returns a cacheable JSON response with custom metadata.
    */
   public function jsonContent(): CacheableResponseInterface {
      $data = [
         'message' => $this->t('Hello, cacheable JSON response!'),
      ];
      $cache_metadata = new CacheableMetadata();
      $cache_metadata->setCacheTags(['my_module_tag']);
      $cache_metadata->setCacheContexts(['url.path', 'user.roles']);
      $cache_metadata->setCacheMaxAge(3600);

      $response = new \Drupal\Core\Ajax\CacheableJsonResponse($data);
      $response->addCacheableDependency($cache_metadata);

      return $response;
   }
}
 


Servicio de caché personalizado con inyección de dependencias

Cómo definir un servicio que utilice inyección de dependencias para trabajar con el servico de caché backend.
Servicio de caché personalizado con inyección de dependencias
              

/**
* Service class for caching data using dependency injection.
*/

use Drupal\Core\Cache\CacheBackendInterface;

class MyCacheService {
   /**
   * The cache backend service.
   */
   protected CacheBackendInterface $cacheBackend;

   /**
   * Constructs a MyCacheService object.
   */
   public function __construct(CacheBackendInterface $cache_backend) {
      $this->$cacheBackend = $cache_backend;
   }

   public function getData(string $cid): ?string {
      $cache = $this->$cacheBackend->get($cid);
      return $cache ? $cache->data : NULL;
   }

   public function setData(string $cid, string $data, int $expire = CacheBackendInterface::CACHE_PERMANENT): void {
      $this->$cacheBackend->set($cid, $data, $expire);
   }
}
 


Uso personalizado de la memoria caché

Cómo utilizar una caché personalizada (por ejemplo, definida en el YAML de servicios de tu módulo como «cache.my_module_bin») para almacenar y recuperar datos.
Uso personalizado de la memoria caché
              

/**
* Retrieve data from a custom cache bin or generate and store it.
*/
$cid = 'my_module:custom_item';
$cache_bin = \Drupal::service('cache.my_module_bin');
if ($item = $cache_bin->get($cid))) {
   $data = $item->data;
} else {
   $data = 'Expensive data calculation';
   $cache_bin->set($cid, $data, Cache::PERMANENT);
}