Skip to content

Commit 2f60792

Browse files
committed
refactor: use LockableInterface and remove deprecations
1 parent 4cce7e0 commit 2f60792

File tree

15 files changed

+153
-25
lines changed

15 files changed

+153
-25
lines changed

config/packages/messenger.yaml

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,5 @@ framework:
2121
options:
2222
queue_name: failed
2323
routing:
24-
'App\Message\Dinosaur\Create': async_low_priority
25-
'App\Message\Dinosaur\Edit': async_low_priority
26-
'App\Message\Dinosaur\Delete': async_low_priority
2724
'App\Message\Food\Consume': async_low_priority
2825
'App\Message\Food\Refill': async_high_priority

src/Controller/DinosaursController.php

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
use Symfony\Component\HttpFoundation\Request;
1414
use Symfony\Component\HttpFoundation\Response;
1515
use Symfony\Component\Messenger\MessageBusInterface;
16+
use Symfony\Component\Messenger\Stamp\HandledStamp;
1617
use Symfony\Component\Routing\Annotation\Route;
1718

1819
class DinosaursController extends AbstractController
@@ -79,7 +80,7 @@ public function create(Request $request, ManagerRegistry $doctrine): Response
7980
if ($form->isSubmitted() && $form->isValid()) {
8081
$data = $form->getData();
8182

82-
$this->bus->dispatch(new Create(
83+
$envelop = $this->bus->dispatch(new Create(
8384
name: $data->getName(),
8485
gender: $data->getGender(),
8586
eyesColor: $data->getEyesColor(),
@@ -88,7 +89,12 @@ public function create(Request $request, ManagerRegistry $doctrine): Response
8889
parkId: $data->getPark()->getId()
8990
));
9091

91-
$this->addFlash('success', 'The dinosaur has been created!');
92+
$result = $envelop->last(HandledStamp::class)->getResult();
93+
94+
$this->addFlash('success', sprintf(
95+
'The dinosaur with id %s has been created!',
96+
$result->id
97+
));
9298

9399
return $this->redirectToRoute('app_list_dinosaurs');
94100
}
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace App\EventListener;
6+
7+
use Psr\Log\LoggerInterface;
8+
use Psr\Log\LogLevel;
9+
use Symfony\Component\EventDispatcher\Attribute\AsEventListener;
10+
use Symfony\Component\Messenger\Event\WorkerMessageFailedEvent;
11+
use Symfony\Component\Messenger\Event\WorkerMessageHandledEvent;
12+
use Symfony\Component\Messenger\Event\WorkerMessageReceivedEvent;
13+
use Symfony\Component\Messenger\Event\WorkerRunningEvent;
14+
use Symfony\Component\Messenger\Event\WorkerStartedEvent;
15+
use Symfony\Component\Messenger\Event\WorkerStoppedEvent;
16+
use Symfony\Component\Messenger\Stamp\HandledStamp;
17+
18+
#[AsEventListener(event: WorkerStartedEvent::class, method: 'onWorkerStartedEvent')]
19+
#[AsEventListener(event: WorkerStoppedEvent::class, method: 'onWorkerStoppedEvent')]
20+
#[AsEventListener(event: WorkerMessageHandledEvent::class, method: 'onWorkerMessageHandledEvent')]
21+
#[AsEventListener(event: WorkerRunningEvent::class, method: 'onWorkerRunningEvent')]
22+
#[AsEventListener(event: WorkerMessageReceivedEvent::class, method: 'onWorkerMessageReceivedEvent')]
23+
#[AsEventListener(event: WorkerMessageFailedEvent::class, method: 'onWorkerMessageFailedEvent')]
24+
class WorkerListener
25+
{
26+
public function __construct(
27+
private LoggerInterface $logger,
28+
) {
29+
}
30+
31+
public function onWorkerStartedEvent(WorkerStartedEvent $event)
32+
{
33+
$transports = $event->getWorker()->getMetadata()->getTransportNames();
34+
35+
$this->logger->log(LogLevel::NOTICE, sprintf(
36+
'Worker started. Transports priority : [%s]',
37+
implode(', ', $transports)
38+
));
39+
}
40+
41+
public function onWorkerStoppedEvent(WorkerStoppedEvent $event)
42+
{
43+
$this->logger->log(LogLevel::NOTICE, 'Worker stopped');
44+
}
45+
46+
public function onWorkerMessageReceivedEvent(WorkerMessageReceivedEvent $event)
47+
{
48+
$envelope = $event->getEnvelope();
49+
50+
$message = $envelope->getMessage();
51+
$messageClass = get_class($message);
52+
53+
$this->logger->log(LogLevel::NOTICE, sprintf('Received message %s', $messageClass));
54+
}
55+
56+
public function onWorkerMessageHandledEvent(WorkerMessageHandledEvent $event)
57+
{
58+
$envelope = $event->getEnvelope();
59+
60+
$handledStamp = $envelope->last(HandledStamp::class);
61+
62+
$handlerName = $handledStamp->getHandlerName();
63+
64+
$message = $envelope->getMessage();
65+
$messageClass = get_class($message);
66+
67+
$this->logger->log(LogLevel::NOTICE, sprintf('Message %s handled by %s', $messageClass, $handlerName));
68+
}
69+
70+
public function onWorkerMessageFailedEvent(WorkerMessageFailedEvent $event)
71+
{
72+
$envelope = $event->getEnvelope();
73+
74+
$message = $envelope->getMessage();
75+
$messageClass = get_class($message);
76+
77+
$this->logger->log(LogLevel::CRITICAL, sprintf('Message %s failed', $messageClass));
78+
}
79+
80+
public function onWorkerRunningEvent()
81+
{
82+
$this->logger->log(LogLevel::NOTICE, 'Worker is running. Waiting for messages...');
83+
}
84+
}

src/Message/Food/Consume.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@
44

55
namespace App\Message\Food;
66

7-
class Consume
7+
use App\Message\Lockable;
8+
9+
class Consume implements Lockable
810
{
911
public function __construct(
1012
public readonly int $dinosaurId,

src/Message/Lockable.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace App\Message;
6+
7+
interface Lockable
8+
{
9+
}

src/MessageHandler/Dinosaur/Create.php

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,20 @@
66
use App\Entity\Park;
77
use App\Entity\Species;
88
use App\Message\Dinosaur\Create as CreateMessage;
9+
use App\MessageResults\Dinosaur\Create as CreateMessageResult;
910
use Doctrine\ORM\EntityManagerInterface;
1011
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
11-
use Symfony\Component\Messenger\Handler\MessageHandlerInterface;
12+
use Symfony\Component\Messenger\Attribute\AsMessageHandler;
1213

13-
final class Create implements MessageHandlerInterface
14+
#[AsMessageHandler]
15+
final class Create
1416
{
1517
public function __construct(
1618
private EntityManagerInterface $entityManager
1719
) {
1820
}
1921

20-
public function __invoke(CreateMessage $message): void
22+
public function __invoke(CreateMessage $message): CreateMessageResult
2123
{
2224
$speciesRepository = $this->entityManager->getRepository(Species::class);
2325
$parkRepository = $this->entityManager->getRepository(Park::class);
@@ -41,5 +43,7 @@ public function __invoke(CreateMessage $message): void
4143

4244
$this->entityManager->persist($dino);
4345
$this->entityManager->flush();
46+
47+
return new CreateMessageResult($dino->getId());
4448
}
4549
}

src/MessageHandler/Dinosaur/Delete.php

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,17 @@
66
use App\Message\Dinosaur\Delete as DeleteMessage;
77
use Doctrine\ORM\EntityManagerInterface;
88
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
9-
use Symfony\Component\Messenger\Handler\MessageHandlerInterface;
9+
use Symfony\Component\Messenger\Attribute\AsMessageHandler;
1010

11-
final class Delete implements MessageHandlerInterface
11+
#[AsMessageHandler]
12+
final class Delete
1213
{
1314
public function __construct(
1415
private EntityManagerInterface $entityManager
1516
) {
1617
}
1718

18-
public function __invoke(DeleteMessage $message): void
19+
public function __invoke(DeleteMessage $message)
1920
{
2021
$dinoRepository = $this->entityManager->getRepository(Dinosaur::class);
2122

src/MessageHandler/Dinosaur/Edit.php

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,20 @@
55
use App\Entity\Dinosaur;
66
use App\Entity\Species;
77
use App\Message\Dinosaur\Edit as EditMessage;
8+
use App\MessageResults\Dinosaur\Edit as EditOutput;
89
use Doctrine\ORM\EntityManagerInterface;
910
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
10-
use Symfony\Component\Messenger\Handler\MessageHandlerInterface;
11+
use Symfony\Component\Messenger\Attribute\AsMessageHandler;
1112

12-
final class Edit implements MessageHandlerInterface
13+
#[AsMessageHandler]
14+
final class Edit
1315
{
1416
public function __construct(
1517
private EntityManagerInterface $entityManager
1618
) {
1719
}
1820

19-
public function __invoke(EditMessage $message): void
21+
public function __invoke(EditMessage $message)
2022
{
2123
$dinosaurRepository = $this->entityManager->getRepository(Dinosaur::class);
2224
$speciesRepository = $this->entityManager->getRepository(Species::class);

src/MessageHandler/Food/Consume.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,10 @@
99
use Doctrine\ORM\EntityManagerInterface;
1010
use DomainException;
1111
use Psr\Log\LoggerInterface;
12-
use Symfony\Component\Messenger\Handler\MessageHandlerInterface;
12+
use Symfony\Component\Messenger\Attribute\AsMessageHandler;
1313

14-
class Consume implements MessageHandlerInterface
14+
#[AsMessageHandler]
15+
class Consume
1516
{
1617
public function __construct(
1718
private EntityManagerInterface $em,

src/MessageHandler/Food/Refill.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,10 @@
99
use Doctrine\ORM\EntityManagerInterface;
1010
use DomainException;
1111
use Psr\Log\LoggerInterface;
12-
use Symfony\Component\Messenger\Handler\MessageHandlerInterface;
12+
use Symfony\Component\Messenger\Attribute\AsMessageHandler;
1313

14-
class Refill implements MessageHandlerInterface
14+
#[AsMessageHandler]
15+
class Refill
1516
{
1617
public function __construct(
1718
private LoggerInterface $logger,

0 commit comments

Comments
 (0)