3. Almacenando en caché

El paquete BlockBundle integra con el SonataCacheBundle para proporcionar varias soluciones de almacenamiento en caché. Dale un vistazo a los adaptadores disponibles en el SonataCacheBundle para ver todas las opciones.

El BlockBundle además proporciona sus propios adaptadores para:

  • ESI
  • SSI
  • Javascript asíncrono
  • Javascript sincrónico

Nota

Es aconsejable almacenar todas las opciones en el bloque documento al utilizar la memoria caché.

3.1. Dependencias

La funcionalidad de memorización en caché es opcional y depende del SonataCacheBundle.

3.2. Instalando

La instalación está dividida entre el SonataCacheBundle, el SymfonyCmfBlockBundle y el SonataBlockBundle:

  1. SonataCacheBundle - Sigue las instrucciones de instalación de la documentación del SonataCacheBundle.
  2. SymfonyCmfBlockBundle - Al final de tu archivo de enrutado, añade las siguientes líneas:
  • YAML
    # app/config/routing.yml
    # ...
    # rutas a los adaptadores de caché SymfonyCmfBlockBundle
    block_cache:
        resource: "@SymfonyCmfBlockBundle/Resources/config/routing/cache.xml"
        prefix: /
    
  1. SonataBlockBundle - Utiliza la clave sonata_block para configurar el adaptador de caché para cada bloque de servicio.
  • YAML
    # app/config/config.yml
    sonata_block:
    # ...
        blocks:
            symfony_cmf.block.action:
                # Usa el id del adaptador del servicio cache
                cache: symfony_cmf.block.cache.js_async
    

3.3. Flujo de trabajo

Lo siguiente sucede al dibujar un bloque la memoria caché:

  • se carga un documento basándose en el nombre
  • si está configurada la memorización en caché, se revisa la caché y si se encuentra el contenido se devuelve
    • las claves de la caché se componen utilizando:
      • las claves de la caché del bloque de servicio
      • las extraCacheKeys pasadas desde la plantilla
    • El adaptador de caché es pedido por un elemento caché
      • los adaptadores ESI y SSI añaden una etiqueta específica y una URL para recuperar el contenido de bloque
      • el adaptador Javascript añade javascript y una URL para recuperar el contenido del bloque
    • Si el elemento caché no ha expirado y tiene datos se devuelve
  • se dibuja la plantilla:
    • Para ESI y SSI la URL es invocada para recuperar el contenido del bloque
    • para Javascript el navegador llama una URL y reemplaza un marcador de posición con el contenido devuelto del bloque

Nota

Los adaptadores de caché adicionales del BlockBundle siempre regresan la caché encontrada, tiene una apariencia similar a la del método has de los adaptadores en el SonataCacheBundle para ver cómo responden ellos.

Si caché está marcado y el adaptador de caché indica que ninguna caché se encontró, el flujo de trabajo procede así:

  • each block document also has a block service, the execute method of it is called to render the block and return a response
  • if the response is cacheable the configured adapter creates a cache element, it contains
    • the computed cache keys
    • the ttl of the response
    • the response
    • and additional contextual keys
  • the template is rendered

3.4. Cache keys

The block service has the responsibility to generate the cache keys, the method getCacheKeys returns these keys, see Bloque de servicio.

The block services shipped with the BlockBunde use the getCacheKeys method of the Sonata\BlockBundle\Block\BaseBlockService, and return:

  • block_id
  • updated_at

Nota

If block settings need to be persisted between requests it is advised to store them in the block document. Alternatively they can be added to the cache keys. However be very cautious because, depending on the adapter, the cache keys can be send to the browser and are not secure.

3.4.1. Extra cache keys

The extra cache keys array is used to store metadata along the cache element. The metadata can be used to invalidate a set of cache elements.

3.4.2. Contextual keys

The contextual cache array hold the object class and id used inside the template. This contextual cache array is then added to the extra cache key.

This feature can be use like this $cacheManager->remove(array('objectId' => 'id')).

Of course not all cache adapters support this feature, varnish and mongodb do.

The BlockBundle also has a cache invalidation listener that calls the flush method of a cache adapter automatically when a cached block document is updated or removed.

3.5. Dibujando el bloque

The following parameters can be used in the sonata_block_render code in your Twig template when using cache:

  • useCache: use the configured cache for a block (default: true)
  • extraCachekeys: expects an array with extra cache keys (default: empty array)
{{ sonata_block_render(
    { 'name': 'rssBlock' },
    true,
    { 'extra_key': 'my_block' }
) }}

3.6. Adaptadores

3.6.1. ESI

This extends the default EsiCache adapter of the SonataCacheBundle.

3.6.1.1. Configurando

  • YAML
    # app/config/config.yml
    symfony_cmf_block:
        # ...
        caches:
            esi:
                token: a unique security key # a random one is generated by default
                servers:
                    - varnishadm -T 127.0.0.1:2000 {{ COMMAND }} "{{ EXPRESSION }}"
    

3.6.2. SSI

This extends the default SsiCache adapter of the SonataCacheBundle.

3.6.2.1. Configurando

  • YAML
    # app/config/config.yml
    symfony_cmf_block:
        # ...
        caches:
            ssi:
               token: una clave de seguridad única # de manera predeterminada se genera una aleatoria
    

3.6.3. JavaScript

Renders the block using javascript, the page is loaded and not waiting for the block to be finished rendering or retrieving data. The block is then asynchronously or synchronously loaded and added to the page.

Bifúrcame en GitHub