2012-06-23 12 views
6

sto usando la cache risultato Doctrine 2 di su una query recuperare il numero di nuovi messaggi di un utente (messaggistica app):Doctrine 2 risultato invalidazione della cache

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

ho cercato di invalidare la cache come questo (nel mio repository di entità):

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

    if (!$result) { 
     return false; 
    } 

    return $cacheDriver->flushAll(); 
} 

In modo che non sia necessario effettuare una query inutile su ciascuna pagina del mio sito Web.

Le mie domande: è una pratica consigliata? Alla fine incontrerò problemi?

risposta

2

Mi è venuta l'idea di creare un hook onFlush. Ci sono tutte le entità in coda per inserimenti, aggiornamenti ed eliminazioni, quindi è possibile invalidare le cache in base al nome e all'identificatore dell'entità, ecc.

Sfortunatamente, non ho ancora creato alcun listener di eventi ma ho sicuramente intenzione di creare una cosa del genere per il mio progetto.

Here è un link alla documentazione dottrina per l'evento onFlush

Edit: V'è anche un modo più semplice per implementare eventi. In una classe di entità è possibile aggiungere @HasLifecycleCallbacks alle annotazioni e quindi è possibile definire una funzione con un'annotazione @PreUpdate o @PrePersist. Ogni volta che questo modello viene aggiornato o persistito, questa funzione verrà chiamata.

/** 
* @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); 
    } 
} 

Quindi forse questo può essere utilizzato per invalidare ogni singola istanza di un'entità?

+0

Non hai risposto alla mia domanda ... – Nanocom