Get Appointment

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² событийно-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρƒ

Π’ соврСмСнном Π²Π΅Π±-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ всС Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ ΠΏΠΎΠΏΡƒΠ»ΡΡ€Π½ΠΎΡΡ‚ΡŒ Π½Π°Π±ΠΈΡ€Π°Π΅Ρ‚ событийно-ориСнтированная Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π°Ρ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π³ΠΈΠ±ΠΊΠΈΠ΅ ΠΈ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Π΅ прилоТСния. Одним ΠΈΠ· ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² Ρ‚Π°ΠΊΠΎΠΉ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ являСтся EventDispatcher β€” инструмСнт для управлСния событиями ΠΈ ΡΠ»ΡƒΡˆΠ°Ρ‚Π΅Π»ΡΠΌΠΈ, ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ чистоту бизнСс-Π»ΠΎΠ³ΠΈΠΊΠΈ ΠΈ Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅ΠΌΠΎΡΡ‚ΡŒ ΠΊΠΎΠ΄Π°.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ события ΠΈ ΡΠ»ΡƒΡˆΠ°Ρ‚Π΅Π»ΠΈ?

Π‘ΠΎΠ±Ρ‹Ρ‚ΠΈΠ΅ β€” это ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΈΠ»ΠΈ дСйствиС Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, рСгистрация ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, ΠΎΡ„ΠΎΡ€ΠΌΠ»Π΅Π½ΠΈΠ΅ Π·Π°ΠΊΠ°Π·Π° ΠΈ Ρ‚.Π΄.), Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅Π°Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ способами. Π‘Π»ΡƒΡˆΠ°Ρ‚Π΅Π»ΡŒ β€” это ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚, ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΠΉ наступлСния ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ события ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠΉ Π½ΡƒΠΆΠ½ΡƒΡŽ бизнСс-Π»ΠΎΠ³ΠΈΠΊΡƒ послС Π΅Π³ΠΎ возникновСния.

EventDispatcher связываСт события ΠΈ ΡΠ»ΡƒΡˆΠ°Ρ‚Π΅Π»Π΅ΠΉ, позволяя Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ нСзависимыС ΠΌΠΎΠ΄ΡƒΠ»ΠΈ прилоТСния ΠΈ ΠΎΠ±Π»Π΅Π³Ρ‡ΠΈΡ‚ΡŒ ΠΈΡ… тСстированиС ΠΈ сопровоТдСниС.

ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π° использования EventDispatcher

  • Π Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ бизнСс-Π»ΠΎΠ³ΠΈΠΊΠΈ: Вся Π»ΠΎΠ³ΠΈΠΊΠ° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ события выносится Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ ΡΠ»ΡƒΡˆΠ°Ρ‚Π΅Π»ΠΈ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ²Ρ‹ΡˆΠ°Π΅Ρ‚ Ρ‡ΠΈΡ‚Π°Π΅ΠΌΠΎΡΡ‚ΡŒ ΠΈ ΡΠΎΠΏΡ€ΠΎΠ²ΠΎΠΆΠ΄Π°Π΅ΠΌΠΎΡΡ‚ΡŒ ΠΊΠΎΠ΄Π°.
  • Π“ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ ΠΈ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌΠΎΡΡ‚ΡŒ: Π›Π΅Π³ΠΊΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ ΡΠ»ΡƒΡˆΠ°Ρ‚Π΅Π»ΠΈ ΠΈΠ»ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Π±Π΅Π· измСнСния основного ΠΊΠΎΠ΄Π°.
  • ΠŸΠ΅Ρ€Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΡΡ‚ΡŒ: Π‘Π»ΡƒΡˆΠ°Ρ‚Π΅Π»ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹ Π² Ρ€Π°Π·Π½Ρ‹Ρ… частях прилоТСния.
  • Π’Π΅ΡΡ‚ΠΈΡ€ΡƒΠ΅ΠΌΠΎΡΡ‚ΡŒ: УпрощаСтся написаниС ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½Ρ‹Ρ… тСстов для бизнСс-Π»ΠΎΠ³ΠΈΠΊΠΈ.

РСализация событий ΠΈ ΡΠ»ΡƒΡˆΠ°Ρ‚Π΅Π»Π΅ΠΉ: соврСмСнныС ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Ρ‹

1. ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ событий

Π‘ΠΎΠ±Ρ‹Ρ‚ΠΈΠ΅ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ прСдставляСт собой класс, содСрТащий ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ΅Π΄ΡˆΠ΅ΠΌ дСйствии. НапримСр, событиС рСгистрации ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΎ Π½ΠΎΠ²ΠΎΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅.

<code>class UserRegisteredEvent {
public $user;
public function __construct($user) {
$this->user = $user;
}
}</code>

2. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΠ»ΡƒΡˆΠ°Ρ‚Π΅Π»Π΅ΠΉ

Π‘Π»ΡƒΡˆΠ°Ρ‚Π΅Π»ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ интСрфСйс, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰ΠΈΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ события. НапримСр, ΡΠ»ΡƒΡˆΠ°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ привСтствСнноС письмо Π½ΠΎΠ²ΠΎΠΌΡƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ.

<code>class SendWelcomeEmailListener {
public function handle(UserRegisteredEvent $event) {
// Π›ΠΎΠ³ΠΈΠΊΠ° ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ письма
}
}</code>

3. РСгистрация событий ΠΈ ΡΠ»ΡƒΡˆΠ°Ρ‚Π΅Π»Π΅ΠΉ

РСгистрация ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ, Ρ‚Π°ΠΊ ΠΈ автоматичСски (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ). ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ связываСт события с ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ ΡΠ»ΡƒΡˆΠ°Ρ‚Π΅Π»ΡΠΌΠΈ.

<code>EventDispatcher::listen(UserRegisteredEvent::class, SendWelcomeEmailListener::class);</code>

4. Π’Ρ‹Π·ΠΎΠ² событий

Когда Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ происходит ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ дСйствиС, вызываСтся событиС с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ диспСтчСра. ВсС связанныС ΡΠ»ΡƒΡˆΠ°Ρ‚Π΅Π»ΠΈ автоматичСски Ρ€Π΅Π°Π³ΠΈΡ€ΡƒΡŽΡ‚ Π½Π° это событиС.

<code>$eventDispatcher->dispatch(new UserRegisteredEvent($user));</code>

ИспользованиС EventDispatcher Π² популярных Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ°Ρ…

  • Symfony: Π˜ΠΌΠ΅Π΅Ρ‚ встроСнный ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ EventDispatcher, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ события Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ядра ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ.
  • Laravel: ΠŸΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ простоС ΠΈ Π»Π°ΠΊΠΎΠ½ΠΈΡ‡Π½ΠΎΠ΅ API для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с событиями ΠΈ ΡΠ»ΡƒΡˆΠ°Ρ‚Π΅Π»ΡΠΌΠΈ, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ ΠΎΡ‡Π΅Ρ€Π΅Π΄Π΅ΠΉ для асинхронной ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ.
  • Yii2: Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ повСдСнчСскиС события для Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² Π±Π΅Π· измСнСния ΠΈΡ… ΠΊΠΎΠ΄Π°.

Π›ΡƒΡ‡ΡˆΠΈΠ΅ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ настройки событий ΠΈ ΡΠ»ΡƒΡˆΠ°Ρ‚Π΅Π»Π΅ΠΉ

  • ВыноситС всю бизнСс-Π»ΠΎΠ³ΠΈΠΊΡƒ рСагирования Π½Π° событиС Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ ΡΠ»ΡƒΡˆΠ°Ρ‚Π΅Π»ΠΈ.
  • Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ событий ΠΈ ΡΠ»ΡƒΡˆΠ°Ρ‚Π΅Π»Π΅ΠΉ ΠΏΠΎ смыслу ΠΈ Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ.
  • Π˜Π·Π±Π΅Π³Π°ΠΉΡ‚Π΅ «ТСсткой» связи ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ β€” EventDispatcher Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π΅Π΄ΠΈΠ½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ ΠΊΠΎΠΌΠΌΡƒΠ½ΠΈΠΊΠ°Ρ†ΠΈΠΈ.
  • Для асинхронных Π·Π°Π΄Π°Ρ‡ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ основной ΠΏΠΎΡ‚ΠΎΠΊ выполнСния.
  • ΠŸΠΎΠΊΡ€Ρ‹Π²Π°ΠΉΡ‚Π΅ ΡΠ»ΡƒΡˆΠ°Ρ‚Π΅Π»ΠΈ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ тСстами для Π³Π°Ρ€Π°Π½Ρ‚ΠΈΠΈ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ бизнСс-Π»ΠΎΠ³ΠΈΠΊΠΈ.

Ошибки ΠΏΡ€ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ событий ΠΈ ΡΠ»ΡƒΡˆΠ°Ρ‚Π΅Π»Π΅ΠΉ

  • БмСшСниС бизнСс-Π»ΠΎΠ³ΠΈΠΊΠΈ события ΠΈ ΡΠ»ΡƒΡˆΠ°Ρ‚Π΅Π»Ρ.
  • ΠΠ΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Π°Ρ рСгистрация ΡΠ»ΡƒΡˆΠ°Ρ‚Π΅Π»Π΅ΠΉ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, мноТСствСнная рСгистрация ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ ΡΠ»ΡƒΡˆΠ°Ρ‚Π΅Π»Ρ).
  • ΠžΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΠΈΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² для критичСски Π²Π°ΠΆΠ½Ρ‹Ρ… событий.
  • ΠžΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΠΈΠ΅ логирования ΠΈ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° Ρ€Π°Π±ΠΎΡ‚Ρ‹ EventDispatcher.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½Π°Ρ настройка событий ΠΈ ΡΠ»ΡƒΡˆΠ°Ρ‚Π΅Π»Π΅ΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ EventDispatcher позволяСт ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ соврСмСнныС, ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Π΅ ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Π΅ прилоТСния. Π­Ρ‚ΠΎ ΠΊΠ»ΡŽΡ‡ ΠΊ ΡƒΠ΄ΠΎΠ±Π½ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ слоТной бизнСс-Π»ΠΎΠ³ΠΈΠΊΠΈ, Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅ΠΌΠΎΡΡ‚ΠΈ ΠΈ лСгкости тСстирования. Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π²Π½Π΅Π΄Ρ€ΠΈΡ‚ΡŒ событийно-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρƒ ΠΈΠ»ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ Π»ΠΎΠ³ΠΈΠΊΡƒ β€” ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠΌΠΎΡ‡ΡŒ Π²Π°ΠΌ с этим. ΠžΠ±Ρ€Π°Ρ‰Π°ΠΉΡ‚Π΅ΡΡŒ ΠΊ профСссионалам!

Avatar
Raman Sapezhka

CEO Plantago/CTO