docs(articles): From Magento to Symfony, a requalification guide grouped into sections
uk/articles/magento-to-symfony/core/events.md
новий файл +74
−0
1
+
# Події
2
+
3
+
**Magento** · events.xml + Observer
4
+
5
+
```xml
6
+
<event name="sales_order_place_after">
7
+
<observer name="vendor_send_confirmation"
8
+
instance="Vendor\Sales\Observer\SendConfirmation"/>
9
+
</event>
10
+
```
11
+
```php
12
+
class SendConfirmation implements ObserverInterface
13
+
{
14
+
public function execute(Observer $observer): void
15
+
{
16
+
$order = $observer->getEvent()->getData('order');
17
+
// ...
18
+
}
19
+
}
20
+
21
+
$this->eventManager->dispatch(
22
+
'sales_order_place_after',
23
+
['order' => $order]
24
+
);
25
+
```
26
+
27
+
**Symfony** · клас події + слухач
28
+
29
+
```php
30
+
final class OrderPlaced
31
+
{
32
+
public function __construct(
33
+
public readonly int $orderId,
34
+
) {}
35
+
}
36
+
37
+
#[AsEventListener(event: OrderPlaced::class)]
38
+
final class SendOrderConfirmation
39
+
{
40
+
public function __invoke(OrderPlaced $event): void
41
+
{
42
+
// ...
43
+
}
44
+
}
45
+
46
+
$this->dispatcher->dispatch(new OrderPlaced($order->getId()));
47
+
```
48
+
49
+
- Подія — типізований клас, ім'я події — його FQCN. Жодних рядкових ключів у масиві.
50
+
- Є пріоритет: `#[AsEventListener(priority: 10)]`, вищий спрацьовує раніше. В Magento порядок спостерігачів не гарантований.
51
+
- `$event->stopPropagation()` зупиняє решту слухачів (подія має наслідувати `Symfony\Contracts\EventDispatcher\Event`).
52
+
- Події Doctrine (`prePersist`, `postUpdate`, `onFlush`) йдуть окремим диспетчером: `#[AsDoctrineListener]`, `#[AsEntityListener]`.
53
+
- Якщо реакція повільна (лист, ERP), слухач кладе повідомлення в Messenger, а не робить роботу сам.
54
+
55
+
**Symfony** · слухач ядра, аналог controller_action_predispatch
56
+
57
+
```php
58
+
#[AsEventListener(event: KernelEvents::REQUEST, priority: 20)]
59
+
final class MaintenanceListener
60
+
{
61
+
public function __construct(
62
+
#[Autowire(env: 'bool:MAINTENANCE')]
63
+
private bool $maintenance,
64
+
) {}
65
+
66
+
public function __invoke(RequestEvent $event): void
67
+
{
68
+
if (!$this->maintenance || !$event->isMainRequest()) {
69
+
return;
70
+
}
71
+
$event->setResponse(new Response('Maintenance', 503));
72
+
}
73
+
}
74
+
```