2012-06-23 19 views
6

estoy usando caché de resultados de Doctrina 2 en una consulta que recupera el número de nuevos mensajes de un usuario (aplicación de mensajería):Doctrina 2 resultado de invalidación de caché

$query->useResultCache(true, 500, 'messaging.nb_new_messages.'.$userId); 

me trató de invalidar esta caché como esto (en el repositorio de mi entidad):

public function clearNbNewMessagesOfUserCache($userId) { 
    $cacheDriver = $this->getEntityManager()->getConfiguration()->getResultCacheImpl(); 
    $result = $cacheDriver->delete('skepin_messaging.nbNewMessages.'.$userId); 

    if (!$result) { 
     return false; 
    } 

    return $cacheDriver->flushAll(); 
} 

Para que no tenga que hacer una consulta inútil en cada página de mi sitio web.

Mis preguntas: ¿es eso una práctica recomendada? ¿Eventualmente me encontraré con problemas?

Respuesta

2

Tuve la idea de construir un gancho onFlush. Ahí tiene todas las entidades en cola para inserciones, actualizaciones y eliminaciones; por lo tanto, puede invalidar las cachés según el nombre e identificador de la entidad, etc.

Desafortunadamente, todavía no he compilado ningún detector de eventos, pero definitivamente planeo construir tal cosa para mi proyecto

Here es un enlace a la documentación de la doctrina para el evento onFlush

Editar: Hay incluso una manera más fácil de implementar eventos. En una clase de entidad puede agregar @HasLifecycleCallbacks a las anotaciones y puede definir una función con una anotación @PreUpdate o @PrePersist. Que cada vez que se actualiza o persiste este modelo, se llamará a esta función.

/** 
* @Entity 
* @Table(name="SomeEntity") 
* @HasLifecycleCallbacks 
*/ 
class SomeEntity 
{ 
    ... 

    /** 
    * @PreUpdate 
    * @PrePersist 
    */ 
    public function preUpdate() 
    { 
     // This function is called every time this model gets updated 
     // or a new instance of this model gets persisted 

     // Somethink like this maybe... 
     // I have not yet completely thought through all this. 
     $cache->save(get_class($this) . '#' . $this->getId(), $this); 
    } 
} 

¿Puede que esto se pueda utilizar para invalidar cada instancia de una entidad?

+0

No respondió mi pregunta ... – Nanocom

Cuestiones relacionadas