mepihindeveloper/php-event-dispatcher

Component for working with events

v1.0.0 2022-02-22 07:59 UTC

This package is auto-updated.

Last update: 2024-12-22 14:35:33 UTC


README

release Packagist Version PHP Version Require license

build codecov

Компонент для работы с событиями и слушателями

Структура

src/
--- exceptions/
------ EventNotFoundException.php
------ ListenerNotFoundException
--- interfaces/
------ ListenerInterface.php
--- Event.php
--- EventDispatcher.php
--- ListenerProvider.php

В директории interfaces хранятся необходимые интерфейсы, которые необходимо имплементировать в при реализации собственного класса Listener. Класс Listener выступает в качестве слушателя события и должен реализовать метод process. В директории exceptions хранятся необходимые исключения. Исключение EventNotFoundException необходимо для идентификации ошибки поиска события (когда событие не было найдено), аналогично и для ListenerNotFoundException.

Класс Event реализует само событие. Собственные события должны наследоваться от класса Event.

Класс EventDispatcher реализует диспетчер событий, который работает через ListenerProvider, выступая посредником.

Класс ListenerProvider реализует поставщика слушателей, где происходят все операции со слушателями и событиями.

Примерная реализация событий и слушателей:

<?php

declare(strict_types = 1);

use mepihindeveloper\components\Event;
use mepihindeveloper\components\EventDispatcher;
use mepihindeveloper\components\interfaces\ListenerInterface;
use mepihindeveloper\components\ListenerProvider;
use Psr\EventDispatcher\StoppableEventInterface;

require_once __DIR__ . '/vendor/autoload.php';

class Event1 extends Event { }

class Event2 extends Event { }

class Event1Listener1 implements ListenerInterface {
	public function process(StoppableEventInterface $event) {
		echo "Я " . get_class($this) . " слушаю событие " . get_class($event) . PHP_EOL;
	}
}

class Event2Listener1 implements ListenerInterface {
	public function process(StoppableEventInterface $event) {
		echo "Я " . get_class($this) . " слушаю событие " . get_class($event) . PHP_EOL;
	}
}

class Event2Listener2 implements ListenerInterface {
	public function process(StoppableEventInterface $event) {
		echo "Я " . get_class($this) . " слушаю событие " . get_class($event) . PHP_EOL;
	}
}

class AllEventsListener implements ListenerInterface {
	public function process(StoppableEventInterface $event) {
		echo "Я " . get_class($this) . " слушаю событие " . get_class($event) . PHP_EOL;
	}
}

$event1 = new Event1;
$event2 = new Event2;
$event1Listener1 = new Event1Listener1;
$event2Listener1 = new Event2Listener1;
$event2Listener2 = new Event2Listener2;
$allEventsListener = new AllEventsListener;

$listenerProvider = new ListenerProvider;
$listenerProvider
	->addListenerForEventType($event1Listener1, Event1::class)
	->addListenerForEventType($event2Listener1, Event2::class)
	->addListenerForEventType($event2Listener2, Event2::class)
	->addListenerForEventType($allEventsListener);

$dispatcher = new EventDispatcher($listenerProvider);
$dispatcher->dispatch($event1);
$dispatcher->dispatch($event2);

Доступные методы

Event

EventDispatcher

ListenerProvider

Контакты

Вы можете связаться со мной в социальной сети ВКонтакте: ВКонтакте: Максим Епихин

Если удобно писать на почту, то можете воспользоваться этим адресом: mepihindeveloper@gmail.com

Мой канал на YouTube, который посвящен разработке веб и игровых проектов: YouTube: Максим Епихин

Поддержать меня можно переводом на Яндекс.Деньги: Денежный перевод