event olay işleme

webman/event kodu müdahale etmeden bazı iş mantıklarını yürütebilmenizi sağlayan şık bir olay mekanizması sunar, bu da iş modülleri arasında ayrışmayı gerçekleştirir. Tipik bir senaryo, bir yeni kullanıcının başarıyla kayıt olduğunda, sadece user.register gibi özel bir olayı yayınlamaktır; bu durumda her modül bu olayı alabilir ve ilgili iş mantığını yürütebilir.

Kurulum

composer require webman/event

Olaylara Abone Olma

Olaylara abone olmak için config/event.php dosyası üzerinden yapılandırma yapılır.

<?php
return [
    'user.register' => [
        [app\event\User::class, 'register'],
        // ...diğer olay işleme fonksiyonları...
    ],
    'user.logout' => [
        [app\event\User::class, 'logout'],
        // ...diğer olay işleme fonksiyonları...
    ]
];

Açıklama:

  • user.register, user.logout gibi ifadeler olay adlarıdır, string türündedir, küçük harfle yazılması ve . ile ayrılması önerilir.
  • Bir olay birden fazla olay işleme fonksiyonu ile ilişkilendirilebilir, çağrı sırası yapılandırılan sırayı takip eder.

Olay İşleme Fonksiyonları

Olay işleme fonksiyonları herhangi bir sınıf yöntemi, fonksiyon veya kapalı fonksiyon olabilir. Örneğin, bir olay işleme sınıfı oluşturmak için app/event/User.php (dizin mevcut değilse kendiniz oluşturun).

<?php
namespace app\event;
class User
{
    function register($user)
    {
        var_export($user);
    }

    function logout($user)
    {
        var_export($user);
    }
}

Olay Yayma

Olay yaymak için Event::dispatch($event_name, $data); veya Event::emit($event_name, $data); kullanılabilir, örneğin:

<?php
namespace app\controller;
use support\Request;
use Webman\Event\Event;
class User
{
    public function register(Request $request)
    {
        $user = [
            'name' => 'webman',
            'age' => 2
        ];
        Event::dispatch('user.register', $user);
    }
}

Olay yayma için iki fonksiyon vardır, Event::dispatch($event_name, $data); ve Event::emit($event_name, $data); her ikisi de aynı parametreleri alır.
Fark, emit içsel olarak otomatik olarak istisnaları yakalarken, yani bir olayın birden fazla işleme fonksiyonu varsa, herhangi bir işleme fonksiyonunda bir istisna oluşursa diğer işleme fonksiyonlarının yürütülmesini etkilemez.
Ancak dispatch, içsel olarak otomatik olarak istisnaları yakalamaz; mevcut olayın herhangi bir işleme fonksiyonunda bir istisna meydana gelirse, bir sonraki işleme fonksiyonunun yürütülmesini durdurur ve doğrudan yukarı bir istisna fırlatır.

İpucu
Parametre $data herhangi bir veri türünde olabilir, örneğin diziler, sınıf örnekleri, stringler vb.

Joker Olay Dinleyici

Joker kaydı, aynı dinleyicide birden fazla olayı işleme almanızı sağlar, örneğin config/event.php içinde yapılandırma:

<?php
return [
    'user.*' => [
        [app\event\User::class, 'deal']
    ],
];

Olay işleme fonksiyonunun ikinci parametresi $event_data ile belirli olay adını alabiliriz:

<?php
namespace app\event;
class User
{
    function deal($user, $event_name)
    {
        echo $event_name; // Belirli olay adı, örneğin user.register user.logout vb.
        var_export($user);
    }
}

Olay Yayılmasını Durdurma

Olay işleme fonksiyonunda false döndüğümüzde, olay yayılması duracaktır.

Kapalı Fonksiyon İle Olay İşleme

Olay işleme fonksiyonları sınıf yöntemleri olabileceği gibi, kapalı fonksiyonlar da olabilir, örneğin:

<?php
return [
    'user.login' => [
        function($user){
            var_dump($user);
        }
    ]
];

Olaylar ve Dinleyicileri Görüntüleme

php webman event:list komutunu kullanarak proje yapılandırmasındaki tüm olayları ve dinleyicileri görüntüleyebilirsiniz.

Destek Kapsamı

Ana projenin temel eklentileri ve uygulama eklentileri aynı şekilde event.php yapılandırmasını destekler.
Temel Eklenti Konfigürasyon Dosyası config/plugin/eklentici/eklentinin_adı/event.php
Uygulama Eklenti Konfigürasyon Dosyası plugin/eklentinin_adı/config/event.php

Dikkat Edilmesi Gerekenler

event olay işleme işlemi asenkron değildir, event yavaş iş mantıkları için uygun değildir, yavaş iş mantıkları belirli bir iş kuyruk işlemi ile işlenmelidir, örneğin webman/redis-queue