PHP ile Event Driven Development


event-driven Event Driven Development, uygulamanin kendi icerisinde iletisimi guclendirdigi icin gelistirici acisindan daha esnek bir gelistirme ortami saglar.

Buradaki mantik, bir event firladigi anda o event bagli, bir yada daha fazla isi yaptirabilmektir. Bkz: Olaya dayalı programlama & Mediator pattern

PHP ile Event Driven isler icin tercih ettigim package tabii ki symfony’nin eventdispatcher’i oluyor 🙂 ZF2 kullaniyorsaniz kendi event manager’ini kullanabilirsiniz. Projeye dahil etmek icin composer.json dosyaniza

"symfony/event-dispatcher": "~2.6"

seklinde ekleyebilirsiniz.

Gelelim basit bir ornek ve kullaniminda;

Oncelikle Event Driven bir yapida olmasi gerekenler;

  1.  Gozlemci: Hangi event firladiginda hangi listenerdan neyin calismasi gerektigini eklememiz gerekmekte. (Observer.php)
  2. Listener’ yani event firladiktan sonra isi yapacak kisim. (Listener.php)
  3. Event’i firlatma (dispatch etme islemi) Birinci kisim icin Observer.php adinda bir dosya olusturduk, dosya icerigi soyle:

namespace Acme;

use SymfonyComponentEventDispatcherEventDispatcher;

class Observer
{
 protected $dispatcher;

public function __construct()
 {
 $this->dispatcher = new EventDispatcher();
 }

 public function registerEvents()
 {
 $userListener = new Listener();
 $this->dispatcher->addListener( 'event.firlattim', array( $userListener, 'eventYakaladim' ) );
 return $this->dispatcher;
 }

 public function getDispatcher()
 {
 return $this->dispatcher;
 }
}

Buradan gordugumuz uzere, “event.firlattim” seklinde bir event firladiginda $userListener’ degiskeniyle ifade ettigim Listener sinifinin eventYakaladim metodunu cagiracagiz.

Ipucu: MVC mimarisindeki bir yazilimda observe islemini controller’lari turettiginiz base class’ta yapabilirsiniz.

Gelelim ikinci maddeye, Listener.php


namespace Acme;

class Listener
{

    public function eventYakaladim()
    {
        echo "event tetiklendi";
    }

}

Burada gorduugmuz gibi eventYakaladim metodu sadece “event tetiklendi” seklinde bir output donecektir. (Tabii ki gercek hayatta bu isler boyle olmuyor, mail atarsin, log basarsin, elasticsearch’e index atarsin vs… )

Gelelim eventi firlattigimiz kisma;

require_once "vendor/autoload.php";
$observer = new AcmeObserver();
$dispatcher = $observer->registerEvents();
$dispatcher->dispatch( 'event.firlattim' );

Burada yukarida bahsettigim gibi sadece “event.firlattim” adinda bir olay firlatiyoruz ve ekrana “event tetiklendi” seklinde ciktisini goruyoruz. Full kodlara github uzerinden : https://github.com/mustafauysal/event-driven-development erisebilirsiniz.

Ipucu: dispatch metoduna ikinci parametre olarak event gecebilirsiniz. Bu sayede event objesi uzerinden parametrik olarak listener’a veri gonderebilirsiniz.

EventDispatcher Bileseninin nasil kullanilacagina detayli olarak suradan bakabilirsiniz.

Iyi de ne isimize yaradi bu!

Ornegin cok basit ve teorik oldugunun farkindayim, misal index.php’de event firlatacagima direkt islemi orada halledebilirim diye dusunebilirsiniz, haklisinizda. Zaten tek index.php dosyasindan olusabilecek kadar basit bir projeyse muhtemelen iceride komplike bir is olmayacaktir.

Daha iyi anlamak adina bir senaryo cikaralim,

Ornegin e-ticaret sisteminde musteri urun aldigi anda hem kargo departmanina hem de muhasebe departmanina mail atmaniz gerekiyor. Iste o sirada “urun.satildi” diye bir event firlatirsiniz ve mail islemlerini o eventi dinleyerek yaptirtirsiniz.

Aradan zaman gecti ve artik urun satildiginda birde kampanya mailleri gondermeniz istendi. Hemen isi yapacak kodu yazin ve “urun.satildi” eventine baglayin. Bu kadar basit.

Not: Bu yazida anlatilanlar “observer design pattern” degildir. 

Tavsiye olarak:

Observer Tasarım Kalıbı ve Olay Güdümlü Programlama” yazisini okumanizi, Writing Extensible Code Using Event Dispatcher videosunu oneririm.

Reklamlar

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Connecting to %s