Krótka piłka – eventy w Doctrine 2

Dzisiaj w pracy przyszło mi zaimplementować następującą funkcjonalność:

po każdej zmianie w treści strony (artykule etc) powinien być automatycznie czyszczony cache

Jako, że używam Doctrine 2, to po krótkim researchu znalazłem funkcjonalność, która idealnie pasowała mi do rozwiązania tego problemu – event listeners. Czym jest event listener ? Jest to odpowiednio skonstruowana klasa, która przypięta do menagera encji Doctrine, potrafi reagować na zdarzenia w jakich on uczestniczy, jak np. update, insert, flush etc. Dzięki temu mogłem zaimplementować swój mechanizm czyszczenia cache, behold:


class CacheCleanerListener {
    private $cache;
    public function __construct($cache){
        $this->cache = $cache;
   }

   public function onFlush(\Doctrine\ORM\Event\OnFlushEventArgs $eventArgs){

       $this->cache->clean();

   }
}

Podpinamy:


$entityManager = EntityManager::create($options, $configDoctrine);
$eventManager = $entityManager->getEventManager();

$listener = new CacheCleanerListener($cache);
$eventManager->addEventListener(array('onFlush'), $listener);

Voila ! Działa. Z cennych uwag i spostrzeżeń:

  • by nasłuchiwać eventu flush jest tylko jedna metoda – onFlush, dla reszty piszemy preUpdate, postUpdate etc.
  • by przypiąć event do managera istnieje jeszcze jedna metoda addEventSubscriber($subscriber), działa w przeciwną stronę do addEventListener – pobiera listę obsługiwanych przez klasę eventów zamiast mieć ją podaną (dziwne ?!)

Spragnionych wiedzy na ten temat odsyłam do obszernej dokumentacji 😉

  1. I tak powinna wyglądać współpraca, i niech mi ktoś powie, że programista to tylko bierny koder…. :) problem stawia osoba definiująca wymaganie, programista implementuje…

  2. No to jest ideał, projektant projektuje a programista wybiera najlepszy sposób implementacji. Natomiast kwestia jeszcze zostaje jak kompleksowy jest dokumentacja projektu, bo w większości małych i średnich firm, zwykle to tylko luźny zbiór wymagań, do tego słabo sformalizowanych.

  1. There are no trackbacks for this post yet.

Leave a Reply

Informuj mnie o odpowiedziach poprzez e-mail. Możesz również subskrybować wpis bez zostawiania komentarza.