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.logoutgibi 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$dataherhangi 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