|
5 | 5 | [](https://packagist.org/packages/mepihindeveloper/php-event-dispatcher)
|
6 | 6 | 
|
7 | 7 |
|
8 |
| - |
9 |
| -[](https://codecov.io/gh/mepihindeveloper/php-event-dispatcher) |
| 8 | + |
| 9 | +[](https://codecov.io/gh/mepihindeveloper/php-event-dispatcher) |
10 | 10 |
|
11 | 11 | Компонент для работы с событиями и слушателями
|
12 | 12 |
|
|
16 | 16 | src/
|
17 | 17 | --- exceptions/
|
18 | 18 | ------ EventNotFoundException.php
|
| 19 | +------ ListenerNotFoundException |
19 | 20 | --- interfaces/
|
20 | 21 | ------ ListenerInterface.php
|
21 | 22 | --- Event.php
|
22 | 23 | --- EventDispatcher.php
|
23 | 24 | --- ListenerProvider.php
|
24 | 25 | ```
|
25 | 26 |
|
| 27 | +В директории `interfaces` хранятся необходимые интерфейсы, которые необходимо имплементировать в при реализации |
| 28 | +собственного класса `Listener`. Класс `Listener` выступает в качестве слушателя события и должен реализовать метод |
| 29 | +`process`. В директории `exceptions` хранятся необходимые исключения. Исключение `EventNotFoundException` необходимо |
| 30 | +для идентификации ошибки поиска события (когда событие не было найдено), аналогично и для `ListenerNotFoundException`. |
| 31 | + |
| 32 | +Класс `Event` реализует само событие. Собственные события должны наследоваться от класса `Event`. |
| 33 | + |
| 34 | +Класс `EventDispatcher` реализует диспетчер событий, который работает через `ListenerProvider`, выступая посредником. |
| 35 | + |
| 36 | +Класс `ListenerProvider` реализует поставщика слушателей, где происходят все операции со слушателями и событиями. |
| 37 | + |
| 38 | +Примерная реализация событий и слушателей: |
| 39 | + |
| 40 | +```php |
| 41 | +<?php |
| 42 | + |
| 43 | +declare(strict_types = 1); |
| 44 | + |
| 45 | +use mepihindeveloper\components\Event; |
| 46 | +use mepihindeveloper\components\EventDispatcher; |
| 47 | +use mepihindeveloper\components\interfaces\ListenerInterface; |
| 48 | +use mepihindeveloper\components\ListenerProvider; |
| 49 | +use Psr\EventDispatcher\StoppableEventInterface; |
| 50 | + |
| 51 | +require_once __DIR__ . '/vendor/autoload.php'; |
| 52 | + |
| 53 | +class Event1 extends Event { } |
| 54 | + |
| 55 | +class Event2 extends Event { } |
| 56 | + |
| 57 | +class Event1Listener1 implements ListenerInterface { |
| 58 | + public function process(StoppableEventInterface $event) { |
| 59 | + echo "Я " . get_class($this) . " слушаю событие " . get_class($event) . PHP_EOL; |
| 60 | + } |
| 61 | +} |
| 62 | + |
| 63 | +class Event2Listener1 implements ListenerInterface { |
| 64 | + public function process(StoppableEventInterface $event) { |
| 65 | + echo "Я " . get_class($this) . " слушаю событие " . get_class($event) . PHP_EOL; |
| 66 | + } |
| 67 | +} |
| 68 | + |
| 69 | +class Event2Listener2 implements ListenerInterface { |
| 70 | + public function process(StoppableEventInterface $event) { |
| 71 | + echo "Я " . get_class($this) . " слушаю событие " . get_class($event) . PHP_EOL; |
| 72 | + } |
| 73 | +} |
| 74 | + |
| 75 | +class AllEventsListener implements ListenerInterface { |
| 76 | + public function process(StoppableEventInterface $event) { |
| 77 | + echo "Я " . get_class($this) . " слушаю событие " . get_class($event) . PHP_EOL; |
| 78 | + } |
| 79 | +} |
| 80 | + |
| 81 | +$event1 = new Event1; |
| 82 | +$event2 = new Event2; |
| 83 | +$event1Listener1 = new Event1Listener1; |
| 84 | +$event2Listener1 = new Event2Listener1; |
| 85 | +$event2Listener2 = new Event2Listener2; |
| 86 | +$allEventsListener = new AllEventsListener; |
| 87 | + |
| 88 | +$listenerProvider = new ListenerProvider; |
| 89 | +$listenerProvider |
| 90 | + ->addListenerForEventType($event1Listener1, Event1::class) |
| 91 | + ->addListenerForEventType($event2Listener1, Event2::class) |
| 92 | + ->addListenerForEventType($event2Listener2, Event2::class) |
| 93 | + ->addListenerForEventType($allEventsListener); |
| 94 | + |
| 95 | +$dispatcher = new EventDispatcher($listenerProvider); |
| 96 | +$dispatcher->dispatch($event1); |
| 97 | +$dispatcher->dispatch($event2); |
| 98 | +``` |
| 99 | + |
26 | 100 |
|
27 | 101 | # Доступные методы
|
28 | 102 |
|
29 |
| -| Метод | Аргументы | Возвращаемые данные | Исключения | Описание | |
30 |
| -|-------------------------------|------------------------------------|---------------------|--------------------------|-----------------------------------------------------------------------------------------------------------------------------------| |
| 103 | +## Event |
| 104 | + |
| 105 | +| Метод | Аргументы | Возвращаемые данные | Исключения | Описание | |
| 106 | +|----------------------|-----------|---------------------|------------|-------------------------------------------------| |
| 107 | +| stopPropagation | | void | | Останавливает работу (распространение) события | |
| 108 | +| isPropagationStopped | | bool | | См. Psr\EventDispatcher\StoppableEventInterface | |
| 109 | + |
| 110 | +## EventDispatcher |
| 111 | + |
| 112 | +| Метод | Аргументы | Возвращаемые данные | Исключения | Описание | |
| 113 | +|----------------------------------------------------------|------------------------------|---------------------------|------------------------|----------------------------------------| |
| 114 | +| __construct(ListenerProviderInterface $listenerProvider | Провайдер слушателей событий | void | | | |
| 115 | +| dispatch(object $event) | Объект события | bool | EventNotFoundException | Отправляет событие слушателям | |
| 116 | +| getListenerProvider | | ListenerProviderInterface | | Получает провайдера слушателей событий | |
| 117 | + |
| 118 | +## ListenerProvider |
31 | 119 |
|
| 120 | +| Метод | Аргументы | Возвращаемые данные | Исключения | Описание | |
| 121 | +|--------------------------------------------------------------------------------------------------------|---------------------------------------------------|---------------------|---------------------------------------------------|---------------------------------------------------| |
| 122 | +| addListenerForEventType(ListenerInterface $listener, string $eventType = self::DEFAULT_EVENT_TYPE) | $listener - Слушатель; $eventType - Тип события | ListenerProvider | | Добавляет слушателя | |
| 123 | +| removeListenerFromEventType(ListenerInterface $listener, string $eventType = self::DEFAULT_EVENT_TYPE) | $listener - Слушатель; $eventType - Тип события | ListenerProvider | EventNotFoundException; ListenerNotFoundException | Удаляет слушателя события | |
| 124 | +| hasListenerInEventType(ListenerInterface $listener, string $eventType = self::DEFAULT_EVENT_TYPE) | $listener - Слушатель; $eventType - Тип события | bool | EventNotFoundException | Проверяет наличие слушателя в событии | |
| 125 | +| hasEventType(string $eventType = self::DEFAULT_EVENT_TYPE) | Тип события | bool | | Проверяет наличие типа события | |
| 126 | +| removeListenersForEventType(string $eventType = self::DEFAULT_EVENT_TYPE) | Тип события | ListenerProvider | EventNotFoundException | Удаляет слушателей события | |
| 127 | +| removeListeners | | ListenerProvider | | Удаляет всех слушателей всех событий | |
| 128 | +| getListenersForEvent(object $event) | См. Psr\EventDispatcher\ListenerProviderInterface | iterable | EventNotFoundException | См. Psr\EventDispatcher\ListenerProviderInterface | |
| 129 | +| getListenersForEventType(string $eventType) | Тип события | array | EventNotFoundException | Получает слушателей события | |
| 130 | +| getListeners | | array | | Получает всех слушателей всех событий | |
32 | 131 |
|
33 | 132 | # Контакты
|
34 | 133 |
|
|
0 commit comments