DESCANSO OBTENGA sin almacenar en caché

11

Usando este tutorial el drupal gprrcomando de la Consola Drupal , he creado un recurso REST personalizado en Drupal 8. Puedo usar este recurso para recuperar un simple objeto JSON que saluda al usuario actual haciendo un GET en:

http://localhost/example/hello?_format=json

El JSON regresado se ve así:

{ "hello": "tyler" }

Esto es de esperarse, ya que estoy conectado. Pero cuando salgo y hago otra GET en el recurso, se devuelve el mismo resultado :

{ "hello": "tyler" }

Hacer un borrado completo de caché de Drupal soluciona este problema, pero me gustaría deshabilitar específicamente el almacenamiento en caché en este recurso. ¿Cómo puedo hacer eso?

Como solución alternativa, pensé que agregar una marca de tiempo a la cadena de consulta funcionaría:

http://localhost/example/hello?_format=json&time=123456789

Pero eso también devuelve el mismo resultado exacto , sin importar el valor de la marca de tiempo en la cadena de consulta.

Por brevedad, aquí está el código esqueleto para construir el recurso GET:

class ExampleHello extends ResourceBase {

  /**
   * {@inheritdoc}
   */
  public static function create(/* ... */) {
    return new static(/* ... */);
  }

  /**
   * Constructs a Drupal\rest\Plugin\ResourceBase object.
   */
  public function __construct(/* ... */) {
    parent::__construct(/* ... */);
    // ...
  }

  /*
   * Responds to GET requests.
   */
  public function get() {

    $account = \Drupal::currentUser()->getAccount();
    if (!$account->id()) {
      return new ResourceResponse(array(
        'welcome' => 'visitor'
      ));
    }
    return new ResourceResponse(array(
      'hello' => $account->getAccountName()
    ));
  }

}

¿Hay una configuración / configuración que necesito establecer en este complemento para deshabilitar el almacenamiento en caché en las solicitudes GET?

tyler.frankenstein
fuente

Respuestas:

16

Desea leer la documentación de Cacheability . dice render arrays, pero también se aplica a objetos de respuesta.

ResourceResponse implementa CacheableResponseInterface, que tiene el método addCacheableDependency.

Si de alguna manera es posible, desea evitar deshabilitar la memoria caché (lo que haría estableciendo la antigüedad máxima de la memoria caché en 0), pero agregue los contextos de caché y las etiquetas de caché necesarios.

En su caché, eso significa que todo lo que necesita hacer es $ response-> addCacheableDependency ($ account).

Tampoco necesita getAccount (), solo use currentUser () directamente, es un proxy.

Berdir
fuente
3
También debe evitar usar \Drupalen lugares donde puede inyectar el servicio, que según su código comentado, parece que puede hacerlo aquí.
mpdonadio
11

Tuve el mismo problema.

Después de leer la documentación y mirar esta página, pude cerrar el caché para mi punto final personalizado. Aquí hay un ejemplo de mi código de trabajo dentro de la función get () para mi punto final:

$build = array(
  '#cache' => array(
    'max-age' => 0,
  ),
);

return (new ResourceResponse($myResponse))->addCacheableDependency($build);

Agregando esto para referencia futura, espero que esto ayude a cualquiera que lo necesite.

Página de documentación de CacheableResponseTrait

Redbrickone
fuente
¡No funciona!
podarok
@podarok: esto tampoco funcionó al principio para mí, luego, después de emitir uno más drush cr, funcionó cada vez después.
tyler.frankenstein
1
trabajado como un encanto.
Mohamed Osama Gbril
5

También tuve el mismo problema y la solución para eso es:

$response->getCacheableMetadata()->addCacheContexts(['url.query_args', 'url.path']);

También puede ver los documentos CacheableMetadata y los contextos de caché .

Iheb
fuente