2012-06-23 21 views
6

Używam doktryny 2 wynikają cache na kwerendzie pobierania liczbę nowych wiadomości od użytkownika (APP wiadomości):Doctrine 2 wynik cache unieważnianie

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

Próbowałem to traci pamięć takiego (w moim repozytorium jednostek):

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

    if (!$result) { 
     return false; 
    } 

    return $cacheDriver->flushAll(); 
} 

Tak, więc nie muszę wykonywać bezużytecznych zapytań na każdej stronie mojej witryny.

Moje pytania: czy to zalecana praktyka? Czy w końcu napotkam problemy?

Odpowiedz

2

Wpadłem na pomysł zbudowania haka OnFlush. Masz wszystkie elementy oczekujące na wstawianie, aktualizowanie i usuwanie, dlatego możesz unieważnić pamięć podręczną w zależności od nazwy i identyfikatora jednostki itp.

Niestety, nie zbudowałem jeszcze żadnych detektorów zdarzeń, ale zdecydowanie planuję zbudować taką rzecz dla mojego projektu.

Here jest link do dokumentacji doktryny na razie onFlush

Edit: Jest jeszcze prostszy sposób wdrożyć wydarzenia. W klasie encji możesz dodać @HasLifecycleCallbacks do adnotacji i możesz zdefiniować funkcję za pomocą adnotacji @PreUpdate lub @PrePersist. Niż za każdym razem, gdy ten model jest aktualizowany lub utrzymywany, ta funkcja zostanie wywołana.

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

Może więc można to wykorzystać do unieważnienia każdej instancji jednostki?

+0

Nie odpowiedziałeś na moje pytanie ... – Nanocom