Symfony - Olaylar ve Olay Listesi
Symfony, etkinliğe dayalı programlama sağlar. EventDispatcherbileşen. Herhangi bir kurumsal uygulama, son derece özelleştirilebilir bir uygulama oluşturmak için olay tabanlı programlamaya ihtiyaç duyar. Olaylar, nesnelerin birbirleriyle etkileşime girmesi için ana araçlardan biridir. Olaylar olmadan, bir nesne verimli bir şekilde etkileşime girmez.
Olay tabanlı programlama süreci şu şekilde özetlenebilir: - Bir nesne, Event sourcemerkezi dispatcher nesnesinden bir olayı kaydetmesini ister, örneğin user.registered. Dinleyici adı verilen bir veya daha fazla nesne, örneğin user.registered gibi belirli bir olayı dinlemek istediği merkezi dağıtıcı nesnesine sorar. Bir noktada, Event kaynağı nesnesi, merkezi dispatcher nesnesinden olayı göndermesini ister, örneğin user.registered ve bir Event nesnesiyle birlikte gerekli bilgilerle birlikte. Merkezi dağıtım programı, user.registered ve Event * nesnesi gibi tüm dinleyici nesnelerini olay hakkında bilgilendirir.
Olay tabanlı programlamada dört tür nesnemiz vardır: Olay Kaynağı, Olay Dinleyici, Hatta Dağıtıcı ve Olayın kendisi.
Konsepti anlamak için basit bir uygulama yazalım.
Step 1 - Bir proje oluşturun, event-dispatcher-example.
cd /path/to/dir
mkdir event-dispatcher-example
cd event-dispatcher-example
composer require symfony/event-dispatcher
Step 2 - Bir sınıf oluşturun, .User.
class User {
public $name; public $age;
}
$user = new User(); $user->name = "Jon";
$user->age = 25
Step 3 - Bir etkinlik oluşturun, UserRegisteredEvent.
use Symfony\Component\EventDispatcher\Event;
class UserRegisteredEvent extends Event {
const NAME = 'user.registered';
protected $user;
public function __construct(User $user) { $this-<user = $user; } public function getUser() { return $this-<user;
}
}
$event = new UserRegisteredEvent($user);
Buraya, UserRegisteredEvent erişimi var Usernesne. Etkinliğin adıuser.registered.
Step 4 - Bir dinleyici oluşturun, UserListener.
class UserListener {
public function onUserRegistrationAction(Event $event) { $user = $event->getUser(); echo $user->name . "\r\n";
echo $user->age . "\r\n"; } } $listener = new UserListener();
Step 5 - Bir olay dağıtıcı nesnesi oluşturun.
use Symfony\Component\EventDispatcher\EventDispatcher;
$dispatcher = new EventDispatcher();
Step 6 - Dispatcher nesnesi ve yöntemini kullanarak dinleyiciyi ve olayı bağlayın, addListener.
$dispatcher
->addListener(
UserRegisteredEvent::NAME,
array($listener, 'onUserRegistrationAction'));
Aşağıdaki kodda gösterildiği gibi olay dinleyicisi olarak anonim bir işlev de ekleyebiliriz.
$dispatcher
->addListener(
UserRegisteredEvent::NAME,
function(Event $event) { $user = $event->getUser(); echo $user->name . "\r\n";
});
Step 7 - Son olarak, olay dağıtıcısının yöntemini kullanarak olayı ateşleyin / gönderin, dispatch.
$dispatcher->dispatch(UserRegisteredEvent::NAME, $event);
Tam kod listesi aşağıdaki gibidir.
main.php
<?php
require __DIR__ . '/vendor/autoload.php';
use Symfony\Component\EventDispatcher\EventDispatcher;
use Symfony\Component\EventDispatcher\Event;
class User {
public $name; public $age;
}
class UserRegisteredEvent extends Event {
const NAME = 'user.registered';
protected $user; public function __construct(User $user) {
$this->user = $user;
}
public function getUser() {
return $this->user; } } class UserListener { public function onUserRegistrationAction(Event $event) {
$user = $event->getUser();
echo $user->name . "\r\n"; echo $user->age . "\r\n";
}
}
$user = new User(); $user->name = "Jon";
$user->age = 25; $event = new UserRegisteredEvent($user); $listener = new UserListener();
$dispatcher = new EventDispatcher(); $dispatcher
->addListener(
UserRegisteredEvent::NAME,
function(Event $event) { $user = $event->getUser(); echo $user->name . "\r\n";
});
$dispatcher ->addListener( UserRegisteredEvent::NAME, array($listener, 'onUserRegistrationAction'));
$dispatcher->dispatch(UserRegisteredEvent::NAME, $event);
?>
Sonuç
Jon
Jon
25
Symfony web çerçevesi birçok etkinliğe sahiptir ve bu olaylar için dinleyici kaydedilebilir ve buna göre programlanabilir. Örnek olaylardan biri kernel.exception ve ilgili olayGetResponseForExceptionEvent, yanıt nesnesini (bir web isteğinin çıktısı) tutan. Bu, kullanıcılara çalışma zamanı hatasını göstermek yerine istisnayı yakalamak ve yanıtı genel hata bilgileriyle değiştirmek için kullanılır.