8

ユーザー(メッセージングアプリ)の新しいメッセージの数を取得するクエリで Doctrine 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();
}

ウェブサイトの各ページで無駄なクエリを作成する必要がないように。

私の質問:それは推奨される方法ですか? 最終的に問題が発生しますか?

4

1 に答える 1

2

onFlushフックを作成するというアイデアがありました。ここでは、挿入、更新、削除のためにすべてのエンティティがキューに入れられているため、エンティティ名や識別子などに応じてキャッシュを無効にすることができます。

残念ながら、私はまだイベントリスナーを構築していませんが、プロジェクトのためにそのようなものを構築することは間違いありません。

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);
    }
}

では、これを使用して、エンティティのすべてのインスタンスを無効にすることができますか?

于 2012-08-28T11:00:43.113 に答える