İçeriğe geç →

Php ile Event Driven Development

EDD kullanıcının gerçekleştirmiş olduğu her bir eylemde bir olay tetikleyerek olaya ait işlemleri gerçekleştirmemize olanak sağlar.Günümüzde çok popüler olan Event Driven Development ‘ı aslında her yerde kullanıldığını görmekteyiz.Örnek olarak kullandığımız işletim sistemlerinde mouse’a sağ click işleminde menü aç vb olaylarda.

Aslında bizler web geliştiriciler olarak mecburen javascript ile dom üzerinde olaylar tetikliyoruz örnek olarak bir event driven development

window.addEventListener('load',()=>{
  console.log('dom loaded');
});

Yukarıdaki örnekte sayfa hazır hale geldiğinde console “dom yüklendi” mesajı veriyoruz.

Bunun gibi bir çok örnek verebiliriz.Şimdi gelelim php’de event driven development kavramına.Aşşağıdaki örnek ile daha kolay anlayabiliriz.

Örnek:

Sisteminize bir üye kayıt oldu.

  • Veritabanına kaydet.
  • Doğrulama Email’i gönder.

Bu iki olayı sisteminize bir üye kayıt olduktan sonra gerçekleştirmek istiyoruz.Nasıl Yaparız ?

Öncelikle sıklıkla kullandığım Symfony Event Dispatcher Component’ini yüklemeniz gerekecektir.

 composer require symfony/event-dispatcher

İşlemi gerçekleştirmek için 2 adet nesneye ihtiyacımız olacak bir olay dağıtıcısı , ikinci olarak ise olayı dinleyicisidir.

EventDispatcher

use Symfony\Component\EventDispatcher\EventDispatcher;

$dispatcher = new EventDispatcher();

EventListener

use Symfony\Component\EventDispatcher\Event; 
$dispatcher->addListener('db.save', function (Event $event) {
// kullanıcı veritabanına kaydet
},1);

$dispatcher->addListener('sent.email', function (Event $event) {
// kullanıcıya doğrulama email'i gönder
},0);

Burada Event listenerımızın içinde ilk parametre olarak bir event adı vermek zorundayız ve aralarında nokta(.) olmak zorundadır.ikinci olarak ise fonksiyon (aynı javascriptteki gibi) veya bir sınıfın bir methodunu tetikletebiliriz.Üçüncü parametre ise öncelik sırasıdır.Bir işlem gerçekleştikten sonra birden fazla olayda bu olayları sıralayabiliriz.Olayları ele alırken büyükten küçüğe doğru bir sıralama izler.

Peki şimdi Event Listener ve Dispatcherımız hazırlandı şuan tek yapmamız gereken olayları tektiklemektir.

Dispatch

$dispatcher->dispatch('sent.email')
$dispatcher->dispatch('db.save');

Yukarıda olaylarımızı tektikledik öncelik sırasıyla (Priortity)

Veritabanına kayıt yapıp,Email Gönderecektir.

Şimdi gelelim bir sınıfın bir metodunu tetiklemeye

Bu örneğimizde bir E-ticaret sistemine sipariş gelmiş sırasıyla

  • Siparişi veritabanına kaydet.
  • Sipariş’in logunu oluştur.
  • Siparişi Önbelleğe al.

işlemlerini gerçekleştireceğiz.

Event Sınıfımız

use Symfony\Component\EventDispatcher\Event;

class OrderPlacedEvent extends Event
{
    public const NAME = 'order.placed';

    protected $order;

    public function __construct()
    {

    }

    public function getOrder()
    {
        return PHP_EOL . 'sipariş numarası 1';
    }

    public function getDate()
    {
        return '12/02/2009';
    }
    
}

Event Sınıfımızı oluştururken Symfony Event’ten extend edip event’e public olarak bir sabit isim vermek zorundayız.

EventListener

class OrderListener
{
    public function saveTable()
    {
        echo 'tabloya kaydedildi'. PHP_EOL;
    }

    public function saveLog()
    {
        echo 'log oluşturuldu.'. PHP_EOL;
    }

    public function cached()
    {
        echo 'cache oluşturuldu.'. PHP_EOL;
    }

    public function getOrder(Event $event)
    {
        echo 'event listened' . PHP_EOL;
        echo $event->getOrder();
    }

}

Yukarıda özel olarak bir listener sınıfı oluşturduk.Listener Sınıfına Event Sınıfını istediğiniz methoduna Dependency Injection yaparak var olan eventinizin methodlarına erişebilirsiniz.

Şuan yapmamız gerekenler yeni bir OrderListener ve OrderPlacedEvent sınıfları oluşturmak ardından eventdispatcher’a listenerı eklemektir.Son olarak ise event’imizi tetiklemektir.

EventDispatch


$event = new OrderPlacedEvent();
$listener = new OrderListener();
$dispatcher->addListener('order.placed', [$listener,'cached'],1);
$dispatcher->addListener('order.placed2', [$listener,'saveLog'],20);
$dispatcher->addListener('order.placed3', [$listener,'saveTable'],30);

$dispatcher->dispatch(OrderPlacedEvent::NAME, $event);

EventSubscriber

Event subscriberlar ile birden fazla olayı dinleyebilir ve daha sıralı hale getirebilirsiniz.

En çok kullanılan yol EventSubscriber’dır.

use Symfony\Component\EventDispatcher\EventSubscriberInterface;

class DemoSubscriber implements EventSubscriberInterface
{


    public static function getSubscribedEvents()
    {
       return array(
           OrderPlacedEvent::NAME => 'onDemoEvent',
           RegisterEvent::NAME =>[
               ['saveTable',-10],
               ['saveLog',0],
               ['cached',-20]
           ]
       );
    }


    public function saveTable()
    {
        echo 'tabloya kaydedildi'. PHP_EOL;
    }

    public function saveLog()
    {
        echo 'log oluşturuldu.'. PHP_EOL;
    }

    public function cached()
    {
        echo 'cache oluşturuldu.'. PHP_EOL;
    }

   
}

Bir EventSubscriber sınıfı oluştururken EventSubscriberInterface’den implement etmeli ve getSubscribedEvents methodunu override etmeliyiz.

getSubscribedEvents

Yukarıdaki methodda bir array return etmeli ve array’in içine tetikleyeceğimiz olayların ismini ve methodlarını vermeliyiz.Bir sınıfta birden fazla method tetiklemek istersek bunu bir dizi içerisine almalıyız.

EventSubscriber ile çalışmak için sırasıyla bir subscriber örneği yaratıp,dispatcherımıza addSubscriber methoduna subscriber’ı parametre olarak geçmeliyiz.Son olarak ise eventimizi tektiklemeliyiz.

$dispatcher = new EventDispatcher();
$subscriber = new DemoSubscriber();
$dispatcher->addSubscriber($subscriber);
$event = new OrderPlacedEvent();

$dispatcher->dispatch(OrderPlacedEvent::NAME, $event);

Event Durdurmak

Bazı durumlarda eventlerimizi durdurma gereksinimi ortaya çıkar bunun için

$event->stopPropagation();

Yukarıdaki methodu kullanabilirsiniz.

Eventi Kontrol Etmek

Bazı durumlarda event’te bir hata çıkıp çıkmadığını kontrol etmemiz gerekebiliyor.Bunun için

$event->isPropagationStopped();

Yukarıdaki methodu kullanabilirsiniz.

SONUÇ

Sonuç olarak bir çok dilde olduğu gibi php ile de event driven development yapılmaktadır.Event driven Development ile yazılan sistemler kendi iç iletişimini geliştirir.

Kategori: php

Yorumlar

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir