2012-06-23 15 views
6

私は、ユーザー(メッセージングアプリ)の新しいメッセージの数を取得するクエリに教義2の結果キャッシュを使用しています:ドクトリン2結果キャッシュの無効化

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

私はこのように、このキャッシュを無効にしてみました(私のエンティティリポジトリ内):

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

    if (!$result) { 
     return false; 
    } 

    return $cacheDriver->flushAll(); 
} 

私のウェブサイトの各ページで無駄なクエリを作成する必要はありません。

私の質問:をお勧めしますか?私は最終的に問題にぶつかるのだろうか?

答えて

2

私はonFlushフックを構築する考えがありました。 挿入、更新、削除のためにすべてのエンティティをキューに入れました。したがって、エンティティ名と識別子などに応じてキャッシュを無効にできます。

残念ながら、まだイベントリスナーは作成していませんが、私のプロジェクトのために。

HereはonFlushイベントの教義のドキュメントへのリンクです

編集:イベントを実装するためにも、もっと簡単な方法があり 。 エンティティクラスでは、アノテーションに@HasLifecycleCallbacksを追加できます。また、@PreUpdateアノテーションまたは@PrePersistアノテーションを使用して関数を定義することもできます。 このモデルが更新または永続化されるたびに、この関数が呼び出されます。

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

これはエンティティのすべての単一インスタンスを無効にするために使用できますか?

+0

あなたは私の質問に答えなかった... – Nanocom

関連する問題