Olay İşleme
webman/event, kodla uğraşmadan iş mantığını çalıştırmanıza ve modüller arasında gevşek bağ sağlamanıza imkân veren zarif bir olay mekanizması sunar. Tipik senaryo: Yeni bir kullanıcı başarıyla kayıt olduğunda, user.register gibi özel bir olay yayınlamanız yeterli; her modül bu olayı alıp ilgili mantığı çalıştırabilir.
Kurulum
composer require webman/event
Olaylara Abone Olma
Olay abonelikleri config/event.php dosyası üzerinden merkezi olarak yapılandırı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ı...
]
];
Not:
user.register,user.logoutvb. olay adlarıdır (string türü). Küçük harfli kelimeler ve nokta (.) ile ayrım önerilir.- Bir olayın birden fazla işleme fonksiyonu olabilir; yapılandırma sırasına göre çağrılır.
Olay İşleme Fonksiyonları
İşleme fonksiyonları sınıf metodu, fonksiyon veya closure olabilir.
Örnek: app/event/User.php sınıfını oluşturun (dizin yoksa oluşturun).
<?php
namespace app\event;
class User
{
function register($user)
{
var_export($user);
}
function logout($user)
{
var_export($user);
}
}
Olay Yayınlama
Olay yayınlamak için Event::dispatch($event_name, $data); veya Event::emit($event_name, $data); kullanın. Örnek:
<?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);
}
}
Yayınlama için iki fonksiyon var: Event::dispatch($event_name, $data); ve Event::emit($event_name, $data); — parametreler aynı. Fark: emit istisnaları dahilde yakalar; bir işleyicide istisna oluşursa diğerleri çalışmaya devam eder. dispatch istisnaları yakalamaz; herhangi bir işleyicide istisna oluşursa yürütme durur ve istisna yukarı iletilir.
İpucu
$dataparametresi dizi, sınıf örneği, dize vb. herhangi bir veri olabilir.
Joker Karakter ile Olay Dinleme
Joker karakter kaydı, aynı dinleyicide birden çok olayı işlemenize izin verir. Örnek config/event.php içinde:
<?php
return [
'user.*' => [
[app\event\User::class, 'deal']
],
];
İşleme fonksiyonunun ikinci parametresi $event_data ile somut olay adı alınabilir:
<?php
namespace app\event;
class User
{
function deal($user, $event_name)
{
echo $event_name; // Somut olay adı, örn. user.register, user.logout vb.
var_export($user);
}
}
Olay Yayınını Durdurma
İşleme fonksiyonunda false döndürüldüğünde, o olayın yayını durur.
Closure ile Olay İşleme
İşleme fonksiyonu sınıf metodu veya closure olabilir. Örnek:
<?php
return [
'user.login' => [
function($user){
var_dump($user);
}
]
];
Olayları ve Dinleyicileri Görüntüleme
Projede yapılandırılan tüm olayları ve dinleyicileri görmek için php webman event:list komutunu kullanın.
Destek Kapsamı
Ana projenin yanı sıra temel eklentiler ve uygulama eklentileri de event.php yapılandırmasını destekler.
Temel eklenti config dosyası: config/plugin/sağlayıcı/eklenti-adı/event.php
Uygulama eklentisi config dosyası: plugin/eklenti-adı/config/event.php
Dikkat Edilmesi Gerekenler
Olay işleme asenkron değildir; yavaş işler için uygun değildir. Yavaş işler için webman/redis-queue gibi mesaj kuyruğu kullanılmalıdır.