ZendFramework-logo-2

Zend Framework 2 EventManager Kullanımı – 1

Geçtiğimiz günlerde Zend Framework 2 yayınlandı. Bir çok yenilik yanında dikkat çeken özelliklerden biri “EventManager” kütüphanesi oldu.  Temel olarak bir veya birden fazla olayı dinlemek, dinlenen bu olayları geretiğinde manuel tetiklemeğe yaramaktadır. Basit örneklerle olayı açıklamaya çalışalım; EventManeger ne işe yarar ? “Event” herhangi bir iş ve oluşu temsil eder. Bunu yaygın olarak JavaScript ile html […]

Geçtiğimiz günlerde Zend Framework 2 yayınlandı. Bir çok yenilik yanında dikkat çeken özelliklerden biri “EventManager” kütüphanesi oldu.  Temel olarak bir veya birden fazla olayı dinlemek, dinlenen bu olayları geretiğinde manuel tetiklemeğe yaramaktadır. Basit örneklerle olayı açıklamaya çalışalım;

EventManeger ne işe yarar ?

  • “Event” herhangi bir iş ve oluşu temsil eder. Bunu yaygın olarak JavaScript ile html inputlarında kullanıyoruz örnek vermek gerekirse “onclick”, “onchange”.
  • EventManager bir nesnedir, bu nesne ile başka nesneleri, metodları dinleyip, bunların çalışması esnasında yapılacak yeni işleri belirleyebiliriz.
  • Eski kodun içine tek satır kod yazmadan sadece çağrıldığı yerde direk çağırmak yerine EventManager üzerinden çağırıp bu sırada yapılacak yeni işleri belirtebiliriz.
  • Başka olayları tetikleyip çalışma sırasında yeni dallanmalar oluşturabiliyoruz.
  • Birden fazla olay dinleyebilir ve bunları istediğiniz sırada çalışmasını sağlayabilirsiniz.

Basit örneklerle işe başlayalım;  Aşağıdaki örnekte meselenin anlaşılması için yukarda yazdıklarımıza benzer örnek verdim.
“click” isimli bir event oluşturdum ama bunun hiç bir zaman bir tıklayanı olmayacağından
ben elle tetikliyorum.

örnek_1

use Zend\EventManager\EventManager;

$events = new EventManager();

$events->attach('click', function($e) {
    $event  = $e->getName();
    $params = $e->getParams();
    printf(
        'Yakalanan Olay "%s", parametreleri %s',
        $event,
        json_encode($params)
    );
});

$params = array('foo' => 'bar', 'baz' => 'bat');
$events->trigger('click', null, $params);

Kodun çıktısı :
Yakalanan Olay “click”, parametreleri {“foo”:”bar”,”baz”:”bat”}

örnek_2

use Zend\EventManager\EventCollection,
    Zend\EventManager\EventManager;

class Example
{
    protected $events;

    public function setEventManager(EventCollection $events)
    {
        $this->events = $events;
    }

    public function events()
    {
        if (!$this->events) {
            $this->setEventManager(new EventManager(
                array(__CLASS__, get_called_class())
            ));
        }
        return $this->events;
    }

    public function click($foo, $baz)
    {
        $params = compact('foo', 'baz');
        $this->events()->trigger(__FUNCTION__, $this, $params);
    }

}

$example = new Example();

$example->events()->attach('click', function($e) {
    $event  = $e->getName();
    $target = get_class($e->getTarget()); // "Example"
    $params = $e->getParams();
    printf(
        'Yakalanan Olay "%s"  hedef: "%s", parametreler %s',
        $event,
        $target,
        json_encode($params)
    );
});

$example->click('bar', 'bat');

Yukardaki örnek aslında ilk örnekle aynı, temel fark  ortadaki “$e->getTarget()” üzerinden
işlemleri yapacak olmamız.
“EventCollection” neyin nesi derseniz bununla birden fazla “EventManager” nesnesini yönetip
burada dinlemesini yapmamıza olanak sağlıyor.
Dikkat ederseniz yukarda method direk çalıştırılıyor. İstenseydi tetiklenebilirdi.

$params = array('bar' => 'bar2', 'bat' => 'bat2');
$example->events()->trigger('click', null, $params);

Yukardaki kodun çıktısı ;
Yakalanan Olay “click” hedef: “”, parametreler {“bar”:”bar2″,”bat”:”bat2″}

Aynı zamanda hata verecek çünkü hedef kısmında get_class ile hedefin bir class olduğunu
ve ismini almak istediğimizi kodda belirttik.

örnek_3

use Zend\EventManager\StaticEventManager;

$events = StaticEventManager::getInstance();
$events->attach('Example', 'click', function($e) {
    $event  = $e->getName();
    $target = get_class($e->getTarget()); // "Example"
    $params = $e->getParams();
    printf(
        'Yakalanan Olay "%s"  hedef: "%s", parametreler %s',
        $event,
        $target,
        json_encode($params)
    );
});

$example = new Example();
$example->click('bar', 'bat');

Yukardaki kodun çıktısı;
Yakalanan Olay “click” hedef: “Example”, parametreler {“foo”:”bar”,”baz”:”bat”}

“StaticEventManager” ile  uygulama seviyesinde ilgili “Class”‘ın içine girmeden dışardan
olay ekleme yapıyoruz. “Example” sınıfının “click” metodu dinleniyor, çağrıldığı anda kendisine verilen
işi yapıyor.

Bu aşamaya kadar yaptıklarımız

  • İlk örneğimizde “EventManager” nesnesi üzerinde sanal bir metod oluşturup onu trigger ile tetikleyip çalıştırdık.
  • İkinci örneğimizde bir “Nesne” içinde tanımladığımız “EventManager”‘a yine bu nesne üzerinden ulaşıp çalıştırdık.
  • Son örnekte kodun içine girmeden dışardan metodumuza işler tanımladık ve çağrıldığı anda çalışmasını sağladık.

Bu birinci bölüm oldu. Konu uzun ve detaylı olduğundan geri kalan kısmı ikinci kısımda anlatmaya çalışacağım.

Kullanılan dosyalara GitHub hesabından ulaşabilirsiniz.

Kaynak: http://weierophinney.net/matthew/archives/266-Using-the-ZF2-EventManager.html