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