From 375a9a5a5191d94cd4ac5ddfc20020385aae04c7 Mon Sep 17 00:00:00 2001 From: Zusoy Date: Mon, 21 Nov 2022 11:52:23 +0100 Subject: [PATCH 01/10] TP1: Creating handler --- .env.dist | 7 ++ composer.json | 1 + composer.lock | 88 +++++++++++++++++++- config/packages/messenger.yaml | 22 +++++ src/Controller/DinosaursController.php | 46 +++++----- src/Controller/SpeciesController.php | 42 +++++----- src/Message/CreateDinosaur.php | 40 +++++++++ src/Message/CreateSpecies.php | 28 +++++++ src/Message/DeleteDinosaur.php | 15 ++++ src/Message/DeleteSpecies.php | 15 ++++ src/Message/EditDinosaur.php | 46 ++++++++++ src/Message/EditSpecies.php | 34 ++++++++ src/MessageHandler/CreateDinosaurHandler.php | 37 ++++++++ src/MessageHandler/CreateSpeciesHandler.php | 27 ++++++ src/MessageHandler/DeleteDinosaurHandler.php | 28 +++++++ src/MessageHandler/DeleteSpeciesHandler.php | 28 +++++++ src/MessageHandler/EditDinosaurHandler.php | 40 +++++++++ src/MessageHandler/EditSpeciesHandler.php | 31 +++++++ symfony.lock | 12 +++ 19 files changed, 548 insertions(+), 39 deletions(-) create mode 100644 config/packages/messenger.yaml create mode 100644 src/Message/CreateDinosaur.php create mode 100644 src/Message/CreateSpecies.php create mode 100644 src/Message/DeleteDinosaur.php create mode 100644 src/Message/DeleteSpecies.php create mode 100644 src/Message/EditDinosaur.php create mode 100644 src/Message/EditSpecies.php create mode 100644 src/MessageHandler/CreateDinosaurHandler.php create mode 100644 src/MessageHandler/CreateSpeciesHandler.php create mode 100644 src/MessageHandler/DeleteDinosaurHandler.php create mode 100644 src/MessageHandler/DeleteSpeciesHandler.php create mode 100644 src/MessageHandler/EditDinosaurHandler.php create mode 100644 src/MessageHandler/EditSpeciesHandler.php diff --git a/.env.dist b/.env.dist index eeafa62..9c035fe 100644 --- a/.env.dist +++ b/.env.dist @@ -7,3 +7,10 @@ MYSQL_VERSION=8.0.27 MYSQL_DATABASE=databasorus MYSQL_USER=user MYSQL_PASSWORD=password + +###> symfony/messenger ### +# Choose one of the transports below +# MESSENGER_TRANSPORT_DSN=doctrine://default +# MESSENGER_TRANSPORT_DSN=amqp://guest:guest@localhost:5672/%2f/messages +# MESSENGER_TRANSPORT_DSN=redis://localhost:6379/messages +###< symfony/messenger ### diff --git a/composer.json b/composer.json index f760f5c..62cca27 100644 --- a/composer.json +++ b/composer.json @@ -22,6 +22,7 @@ "symfony/http-client": "^7.0", "symfony/intl": "^7.0", "symfony/mailer": "^7.0", + "symfony/messenger": "^7.0", "symfony/mime": "^7.0", "symfony/monolog-bundle": "^3.10", "symfony/notifier": "^7.0", diff --git a/composer.lock b/composer.lock index a3c72ad..51a931c 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "e1d68fda857d3a6a99a9c9d4e0c1c4dd", + "content-hash": "863b8a671f2999fb57ae1b36edd77ebc", "packages": [ { "name": "composer/package-versions-deprecated", @@ -4193,6 +4193,92 @@ ], "time": "2024-03-28T09:20:36+00:00" }, + { + "name": "symfony/messenger", + "version": "v6.1.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/messenger.git", + "reference": "3d7fbc507ad31e71a96e8e65342243e2dbe22fa1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/messenger/zipball/3d7fbc507ad31e71a96e8e65342243e2dbe22fa1", + "reference": "3d7fbc507ad31e71a96e8e65342243e2dbe22fa1", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/log": "^1|^2|^3" + }, + "conflict": { + "symfony/event-dispatcher": "<5.4", + "symfony/event-dispatcher-contracts": "<2", + "symfony/framework-bundle": "<5.4", + "symfony/http-kernel": "<5.4", + "symfony/serializer": "<5.4" + }, + "require-dev": { + "psr/cache": "^1.0|^2.0|^3.0", + "symfony/console": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/event-dispatcher": "^5.4|^6.0", + "symfony/http-kernel": "^5.4|^6.0", + "symfony/process": "^5.4|^6.0", + "symfony/property-access": "^5.4|^6.0", + "symfony/routing": "^5.4|^6.0", + "symfony/serializer": "^5.4|^6.0", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/stopwatch": "^5.4|^6.0", + "symfony/validator": "^5.4|^6.0" + }, + "suggest": { + "enqueue/messenger-adapter": "For using the php-enqueue library as a transport." + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Messenger\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Samuel Roze", + "email": "samuel.roze@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Helps applications send and receive messages to/from other applications or via message queues", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/messenger/tree/v6.1.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-10-10T09:34:31+00:00" + }, { "name": "symfony/mime", "version": "v7.0.6", diff --git a/config/packages/messenger.yaml b/config/packages/messenger.yaml new file mode 100644 index 0000000..e03b16c --- /dev/null +++ b/config/packages/messenger.yaml @@ -0,0 +1,22 @@ +framework: + messenger: + # Uncomment this (and the failed transport below) to send failed messages to this transport for later handling. + # failure_transport: failed + + transports: + # https://symfony.com/doc/current/messenger.html#transport-configuration + # async: '%env(MESSENGER_TRANSPORT_DSN)%' + # failed: 'doctrine://default?queue_name=failed' + # sync: 'sync://' + + routing: + # Route your messages to the transports + # 'App\Message': async + +# when@test: +# framework: +# messenger: +# transports: +# # replace with your transport name here (e.g., my_transport: 'in-memory://') +# # For more Messenger testing tools, see https://github.com/zenstruck/messenger-test +# async: 'in-memory://' diff --git a/src/Controller/DinosaursController.php b/src/Controller/DinosaursController.php index 4ced07c..0f9b98b 100644 --- a/src/Controller/DinosaursController.php +++ b/src/Controller/DinosaursController.php @@ -5,14 +5,22 @@ use App\Entity\Dinosaur; use App\Form\Type\DinosaurType; use App\Form\Type\SearchType; +use App\Message\CreateDinosaur; +use App\Message\DeleteDinosaur; +use App\Message\EditDinosaur; use Doctrine\Persistence\ManagerRegistry; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\Messenger\MessageBusInterface; use Symfony\Component\Routing\Annotation\Route; final class DinosaursController extends AbstractController { + public function __construct(private MessageBusInterface $bus) + { + } + #[Route('/dinosaurs', name: 'app_list_dinosaurs')] public function list(Request $request, ManagerRegistry $doctrine): Response { @@ -65,11 +73,15 @@ public function create(Request $request, ManagerRegistry $doctrine): Response $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { - $em = $doctrine->getManager(); - $dinosaur = $form->getData(); + $data = $form->getData(); - $em->persist($dinosaur); - $em->flush(); + $this->bus->dispatch(new CreateDinosaur( + name: $data->getName(), + gender: $data->getGender(), + eyesColor: $data->getEyesColor(), + age: $data->getAge(), + speciesId: $data->getSpecies()->getId() + )); $this->addFlash('success', 'The dinosaur has been created!'); @@ -101,10 +113,16 @@ public function edit(Request $request, int $id, ManagerRegistry $doctrine): Resp $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { - $em = $doctrine->getManager(); - $dinosaur = $form->getData(); + $data = $form->getData(); - $em->flush(); + $this->bus->dispatch(new EditDinosaur( + id: $id, + name: $data->getName(), + gender: $data->getGender(), + eyesColor: $data->getEyesColor(), + age: $data->getAge(), + speciesId: $data->getSpecies()->getId() + )); $this->addFlash('success', 'The dinosaur has been edited!'); @@ -121,19 +139,9 @@ public function edit(Request $request, int $id, ManagerRegistry $doctrine): Resp name: 'app_remove_dinosaur', requirements: ['id' => '\d+'] )] - public function remove(int $id, ManagerRegistry $doctrine): Response + public function remove(int $id): Response { - $dinosaur = $doctrine - ->getRepository(Dinosaur::class) - ->find($id); - - if (false === $dinosaur) { - throw $this->createNotFoundException('The dinosaur you are looking for does not exists.'); - } - - $em = $doctrine->getManager(); - $em->remove($dinosaur); - $em->flush(); + $this->bus->dispatch(new DeleteDinosaur($id)); $this->addFlash('success', 'The dinosaur has been removed!'); diff --git a/src/Controller/SpeciesController.php b/src/Controller/SpeciesController.php index 7d356f8..972f0a9 100644 --- a/src/Controller/SpeciesController.php +++ b/src/Controller/SpeciesController.php @@ -4,14 +4,22 @@ use App\Entity\Species; use App\Form\Type\SpeciesType; +use App\Message\CreateSpecies; +use App\Message\DeleteSpecies; +use App\Message\EditSpecies; use Doctrine\Persistence\ManagerRegistry; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\Messenger\MessageBusInterface; use Symfony\Component\Routing\Annotation\Route; final class SpeciesController extends AbstractController { + public function __construct(private MessageBusInterface $bus) + { + } + #[Route('/species', name: 'app_list_species')] public function list(ManagerRegistry $doctrine): Response { @@ -32,11 +40,13 @@ public function create(Request $request, ManagerRegistry $doctrine): Response $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { - $em = $doctrine->getManager(); - $species = $form->getData(); + $data = $form->getData(); - $em->persist($species); - $em->flush(); + $this->bus->dispatch(new CreateSpecies( + name: $data->getName(), + feeding: $data->getFeeding(), + habitats: $data->getHabitats() + )); $this->addFlash('success', 'The species has been created!'); @@ -68,10 +78,14 @@ public function edit(Request $request, int $id, ManagerRegistry $doctrine): Resp $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { - $em = $doctrine->getManager(); - $species = $form->getData(); + $data = $form->getData(); - $em->flush(); + $this->bus->dispatch(new EditSpecies( + id: $id, + name: $data->getName(), + feeding: $data->getFeeding(), + habitats: $data->getHabitats() + )); $this->addFlash('success', 'The species has been edited!'); @@ -88,19 +102,9 @@ public function edit(Request $request, int $id, ManagerRegistry $doctrine): Resp name: 'app_remove_species', requirements: ['id' => '\d+'] )] - public function remove(int $id, ManagerRegistry $doctrine): Response + public function remove(int $id): Response { - $species = $doctrine - ->getRepository(Species::class) - ->find($id); - - if (false === $species) { - throw $this->createNotFoundException('The species you are looking for does not exists.'); - } - - $em = $doctrine->getManager(); - $em->remove($species); - $em->flush(); + $this->bus->dispatch(new DeleteSpecies($id)); $this->addFlash('success', 'The species has been removed!'); diff --git a/src/Message/CreateDinosaur.php b/src/Message/CreateDinosaur.php new file mode 100644 index 0000000..a59011f --- /dev/null +++ b/src/Message/CreateDinosaur.php @@ -0,0 +1,40 @@ +name; + } + + public function getGender(): string + { + return $this->gender; + } + + public function getEyesColor(): string + { + return $this->eyesColor; + } + + public function getAge(): int + { + return $this->age; + } + + public function getSpeciesId(): int + { + return $this->speciesId; + } +} diff --git a/src/Message/CreateSpecies.php b/src/Message/CreateSpecies.php new file mode 100644 index 0000000..a79e82a --- /dev/null +++ b/src/Message/CreateSpecies.php @@ -0,0 +1,28 @@ +name; + } + + public function getFeeding(): string + { + return $this->feeding; + } + + public function getHabitats(): array + { + return $this->habitats; + } +} diff --git a/src/Message/DeleteDinosaur.php b/src/Message/DeleteDinosaur.php new file mode 100644 index 0000000..92fed97 --- /dev/null +++ b/src/Message/DeleteDinosaur.php @@ -0,0 +1,15 @@ +id; + } +} diff --git a/src/Message/DeleteSpecies.php b/src/Message/DeleteSpecies.php new file mode 100644 index 0000000..7821233 --- /dev/null +++ b/src/Message/DeleteSpecies.php @@ -0,0 +1,15 @@ +id; + } +} diff --git a/src/Message/EditDinosaur.php b/src/Message/EditDinosaur.php new file mode 100644 index 0000000..0726b01 --- /dev/null +++ b/src/Message/EditDinosaur.php @@ -0,0 +1,46 @@ +id; + } + + public function getName(): string + { + return $this->name; + } + + public function getGender(): string + { + return $this->gender; + } + + public function getEyesColor(): string + { + return $this->eyesColor; + } + + public function getAge(): int + { + return $this->age; + } + + public function getSpeciesId(): int + { + return $this->speciesId; + } +} diff --git a/src/Message/EditSpecies.php b/src/Message/EditSpecies.php new file mode 100644 index 0000000..8817de5 --- /dev/null +++ b/src/Message/EditSpecies.php @@ -0,0 +1,34 @@ +id; + } + + public function getName(): string + { + return $this->name; + } + + public function getFeeding(): string + { + return $this->feeding; + } + + public function getHabitats(): array + { + return $this->habitats; + } +} diff --git a/src/MessageHandler/CreateDinosaurHandler.php b/src/MessageHandler/CreateDinosaurHandler.php new file mode 100644 index 0000000..2897bbd --- /dev/null +++ b/src/MessageHandler/CreateDinosaurHandler.php @@ -0,0 +1,37 @@ +entityManager->getRepository(Species::class); + + if (!$species = $speciesRepository->find($message->getSpeciesId())) { + throw new NotFoundHttpException("Species with id {$message->getSpeciesId()} not found"); + } + + $dino = new Dinosaur( + name: $message->getName(), + gender: $message->getGender(), + species: $species, + age: $message->getAge(), + eyesColor: $message->getEyesColor() + ); + + $this->entityManager->persist($dino); + $this->entityManager->flush(); + } +} diff --git a/src/MessageHandler/CreateSpeciesHandler.php b/src/MessageHandler/CreateSpeciesHandler.php new file mode 100644 index 0000000..7b2c54b --- /dev/null +++ b/src/MessageHandler/CreateSpeciesHandler.php @@ -0,0 +1,27 @@ +getName(), + habitats: $message->getHabitats(), + feeding: $message->getFeeding() + ); + + $this->entityManager->persist($species); + $this->entityManager->flush(); + } +} diff --git a/src/MessageHandler/DeleteDinosaurHandler.php b/src/MessageHandler/DeleteDinosaurHandler.php new file mode 100644 index 0000000..324874d --- /dev/null +++ b/src/MessageHandler/DeleteDinosaurHandler.php @@ -0,0 +1,28 @@ +entityManager->getRepository(Dinosaur::class); + + if (!$dinosaur = $dinoRepository->find($message->getId())) { + throw new NotFoundHttpException("Dinosaur with id {$message->getId()} not found"); + } + + $this->entityManager->remove($dinosaur); + $this->entityManager->flush(); + } +} diff --git a/src/MessageHandler/DeleteSpeciesHandler.php b/src/MessageHandler/DeleteSpeciesHandler.php new file mode 100644 index 0000000..e9b95f1 --- /dev/null +++ b/src/MessageHandler/DeleteSpeciesHandler.php @@ -0,0 +1,28 @@ +entityManager->getRepository(Species::class); + + if (!$species = $speciesRepository->find($message->getId())) { + throw new NotFoundHttpException("Species with id {$message->getId()} not found"); + } + + $this->entityManager->remove($species); + $this->entityManager->flush(); + } +} diff --git a/src/MessageHandler/EditDinosaurHandler.php b/src/MessageHandler/EditDinosaurHandler.php new file mode 100644 index 0000000..02360e6 --- /dev/null +++ b/src/MessageHandler/EditDinosaurHandler.php @@ -0,0 +1,40 @@ +entityManager->getRepository(Dinosaur::class); + $speciesRepository = $this->entityManager->getRepository(Species::class); + + /** @var Dinosaur $dinosaur */ + if (!$dinosaur = $dinosaurRepository->find($message->getId())) { + throw new NotFoundHttpException("Dinosaur with id {$message->getId()} not found"); + } + + /** @var Species $species */ + if (!$species = $speciesRepository->find($message->getSpeciesId())) { + throw new NotFoundHttpException("Species with id {$message->getSpeciesId()} not found"); + } + + $dinosaur->setName($message->getName()); + $dinosaur->setEyesColor($message->getEyesColor()); + $dinosaur->setAge($message->getAge()); + $dinosaur->setSpecies($species); + + $this->entityManager->flush(); + } +} diff --git a/src/MessageHandler/EditSpeciesHandler.php b/src/MessageHandler/EditSpeciesHandler.php new file mode 100644 index 0000000..54744de --- /dev/null +++ b/src/MessageHandler/EditSpeciesHandler.php @@ -0,0 +1,31 @@ +entityManager->getRepository(Species::class); + + if (!$species = $speciesRepository->find($message->getId())) { + throw new NotFoundHttpException("Species with id {$message->getId()} not found"); + } + + $species->setName($message->getName()); + $species->setFeeding($message->getFeeding()); + $species->setHabitats($message->getHabitats()); + + $this->entityManager->flush(); + } +} diff --git a/symfony.lock b/symfony.lock index e355d56..07c807e 100644 --- a/symfony.lock +++ b/symfony.lock @@ -353,6 +353,18 @@ "ref": "fadbfe33303a76e25cb63401050439aa9b1a9c7f" } }, + "symfony/messenger": { + "version": "6.1", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "main", + "version": "6.0", + "ref": "2523f7d31488903e247a522e760dc279be7f7aaf" + }, + "files": [ + "config/packages/messenger.yaml" + ] + }, "symfony/mime": { "version": "v5.3.8" }, From af192f26328c4239b0692e2fbbcd365a3b929489 Mon Sep 17 00:00:00 2001 From: Zusoy Date: Tue, 22 Nov 2022 11:45:15 +0100 Subject: [PATCH 02/10] TP2: Consuming Messages --- Makefile | 5 +++ composer.json | 1 + composer.lock | 74 +++++++++++++++++++++++++++++++++- config/packages/messenger.yaml | 6 ++- 4 files changed, 83 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 0ef82db..d12b2af 100644 --- a/Makefile +++ b/Makefile @@ -32,3 +32,8 @@ fixtures-load: .PHONY: reset-db reset-db: database-drop database-create database-migrate fixtures-load + docker compose run --rm php bin/console doctrine:fixtures:load + +.PHONY: worker +worker: + docker compose run --rm php bin/console messenger:consume async -vv diff --git a/composer.json b/composer.json index 62cca27..55642f2 100644 --- a/composer.json +++ b/composer.json @@ -14,6 +14,7 @@ "phpdocumentor/reflection-docblock": "^5.4", "symfony/asset": "^7.0", "symfony/console": "^7.0", + "symfony/doctrine-messenger": "^7.0", "symfony/dotenv": "^7.0", "symfony/expression-language": "^7.0", "symfony/flex": "^2.4.5", diff --git a/composer.lock b/composer.lock index 51a931c..52435fa 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "863b8a671f2999fb57ae1b36edd77ebc", + "content-hash": "33b580876a3a71728728d8f42666f2fb", "packages": [ { "name": "composer/package-versions-deprecated", @@ -2870,6 +2870,78 @@ ], "time": "2024-03-19T09:29:21+00:00" }, + { + "name": "symfony/doctrine-messenger", + "version": "v6.1.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/doctrine-messenger.git", + "reference": "b7587ed78b788a65958592ec5dccd226a0f6fd8e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/doctrine-messenger/zipball/b7587ed78b788a65958592ec5dccd226a0f6fd8e", + "reference": "b7587ed78b788a65958592ec5dccd226a0f6fd8e", + "shasum": "" + }, + "require": { + "doctrine/dbal": "^2.13|^3.0", + "php": ">=8.1", + "symfony/messenger": "^5.4|^6.0", + "symfony/service-contracts": "^1.1|^2|^3" + }, + "conflict": { + "doctrine/persistence": "<1.3" + }, + "require-dev": { + "doctrine/persistence": "^1.3|^2|^3", + "symfony/property-access": "^5.4|^6.0", + "symfony/serializer": "^5.4|^6.0" + }, + "type": "symfony-messenger-bridge", + "autoload": { + "psr-4": { + "Symfony\\Component\\Messenger\\Bridge\\Doctrine\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Doctrine Messenger Bridge", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/doctrine-messenger/tree/v6.1.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-08-12T13:09:07+00:00" + }, { "name": "symfony/dotenv", "version": "v7.0.4", diff --git a/config/packages/messenger.yaml b/config/packages/messenger.yaml index e03b16c..f4cfa31 100644 --- a/config/packages/messenger.yaml +++ b/config/packages/messenger.yaml @@ -5,13 +5,15 @@ framework: transports: # https://symfony.com/doc/current/messenger.html#transport-configuration - # async: '%env(MESSENGER_TRANSPORT_DSN)%' + async: '%env(MESSENGER_TRANSPORT_DSN)%' # failed: 'doctrine://default?queue_name=failed' # sync: 'sync://' routing: # Route your messages to the transports - # 'App\Message': async + 'App\Message\CreateDinosaur': async + 'App\Message\EditDinosaur': async + 'App\Message\DeleteDinosaur': async # when@test: # framework: From a60984c59870bade1019b52bccd3cb647075eb74 Mon Sep 17 00:00:00 2001 From: ErwannLeRoux Date: Mon, 6 Feb 2023 15:46:20 +0100 Subject: [PATCH 03/10] refactor: namespaces and classnames --- composer.lock | 12 ++--- config/packages/messenger.yaml | 22 ++------- src/Controller/DinosaursController.php | 12 ++--- src/Controller/SpeciesController.php | 12 ++--- src/Message/CreateDinosaur.php | 40 ---------------- src/Message/CreateSpecies.php | 28 ----------- src/Message/DeleteDinosaur.php | 15 ------ src/Message/DeleteSpecies.php | 15 ------ src/Message/Dinosaur/Create.php | 15 ++++++ src/Message/Dinosaur/Delete.php | 11 +++++ src/Message/Dinosaur/Edit.php | 16 +++++++ src/Message/EditDinosaur.php | 46 ------------------- src/Message/EditSpecies.php | 34 -------------- src/Message/Species/Create.php | 13 ++++++ src/Message/Species/Delete.php | 11 +++++ src/Message/Species/Edit.php | 14 ++++++ src/MessageHandler/CreateSpeciesHandler.php | 27 ----------- .../Create.php} | 25 +++++----- .../Delete.php} | 17 +++---- src/MessageHandler/Dinosaur/Edit.php | 39 ++++++++++++++++ src/MessageHandler/EditDinosaurHandler.php | 40 ---------------- src/MessageHandler/EditSpeciesHandler.php | 31 ------------- src/MessageHandler/Species/Create.php | 28 +++++++++++ .../Delete.php} | 15 +++--- src/MessageHandler/Species/Edit.php | 32 +++++++++++++ 25 files changed, 230 insertions(+), 340 deletions(-) delete mode 100644 src/Message/CreateDinosaur.php delete mode 100644 src/Message/CreateSpecies.php delete mode 100644 src/Message/DeleteDinosaur.php delete mode 100644 src/Message/DeleteSpecies.php create mode 100644 src/Message/Dinosaur/Create.php create mode 100644 src/Message/Dinosaur/Delete.php create mode 100644 src/Message/Dinosaur/Edit.php delete mode 100644 src/Message/EditDinosaur.php delete mode 100644 src/Message/EditSpecies.php create mode 100644 src/Message/Species/Create.php create mode 100644 src/Message/Species/Delete.php create mode 100644 src/Message/Species/Edit.php delete mode 100644 src/MessageHandler/CreateSpeciesHandler.php rename src/MessageHandler/{CreateDinosaurHandler.php => Dinosaur/Create.php} (50%) rename src/MessageHandler/{DeleteDinosaurHandler.php => Dinosaur/Delete.php} (55%) create mode 100644 src/MessageHandler/Dinosaur/Edit.php delete mode 100644 src/MessageHandler/EditDinosaurHandler.php delete mode 100644 src/MessageHandler/EditSpeciesHandler.php create mode 100644 src/MessageHandler/Species/Create.php rename src/MessageHandler/{DeleteSpeciesHandler.php => Species/Delete.php} (59%) create mode 100644 src/MessageHandler/Species/Edit.php diff --git a/composer.lock b/composer.lock index 52435fa..fbb5810 100644 --- a/composer.lock +++ b/composer.lock @@ -2872,16 +2872,16 @@ }, { "name": "symfony/doctrine-messenger", - "version": "v6.1.4", + "version": "v6.1.11", "source": { "type": "git", "url": "https://github.com/symfony/doctrine-messenger.git", - "reference": "b7587ed78b788a65958592ec5dccd226a0f6fd8e" + "reference": "e4b775d2dadcc801d2404c701555c2638690811e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-messenger/zipball/b7587ed78b788a65958592ec5dccd226a0f6fd8e", - "reference": "b7587ed78b788a65958592ec5dccd226a0f6fd8e", + "url": "https://api.github.com/repos/symfony/doctrine-messenger/zipball/e4b775d2dadcc801d2404c701555c2638690811e", + "reference": "e4b775d2dadcc801d2404c701555c2638690811e", "shasum": "" }, "require": { @@ -2924,7 +2924,7 @@ "description": "Symfony Doctrine Messenger Bridge", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/doctrine-messenger/tree/v6.1.4" + "source": "https://github.com/symfony/doctrine-messenger/tree/v6.1.11" }, "funding": [ { @@ -2940,7 +2940,7 @@ "type": "tidelift" } ], - "time": "2022-08-12T13:09:07+00:00" + "time": "2023-01-01T08:36:55+00:00" }, { "name": "symfony/dotenv", diff --git a/config/packages/messenger.yaml b/config/packages/messenger.yaml index f4cfa31..86c7d52 100644 --- a/config/packages/messenger.yaml +++ b/config/packages/messenger.yaml @@ -1,24 +1,8 @@ framework: messenger: - # Uncomment this (and the failed transport below) to send failed messages to this transport for later handling. - # failure_transport: failed - transports: - # https://symfony.com/doc/current/messenger.html#transport-configuration async: '%env(MESSENGER_TRANSPORT_DSN)%' - # failed: 'doctrine://default?queue_name=failed' - # sync: 'sync://' - routing: - # Route your messages to the transports - 'App\Message\CreateDinosaur': async - 'App\Message\EditDinosaur': async - 'App\Message\DeleteDinosaur': async - -# when@test: -# framework: -# messenger: -# transports: -# # replace with your transport name here (e.g., my_transport: 'in-memory://') -# # For more Messenger testing tools, see https://github.com/zenstruck/messenger-test -# async: 'in-memory://' + 'App\Message\Dinosaur\Create': async + 'App\Message\Dinosaur\Edit': async + 'App\Message\Dinosaur\Delete': async diff --git a/src/Controller/DinosaursController.php b/src/Controller/DinosaursController.php index 0f9b98b..43b4a83 100644 --- a/src/Controller/DinosaursController.php +++ b/src/Controller/DinosaursController.php @@ -5,9 +5,9 @@ use App\Entity\Dinosaur; use App\Form\Type\DinosaurType; use App\Form\Type\SearchType; -use App\Message\CreateDinosaur; -use App\Message\DeleteDinosaur; -use App\Message\EditDinosaur; +use App\Message\Dinosaur\Create; +use App\Message\Dinosaur\Delete; +use App\Message\Dinosaur\Edit; use Doctrine\Persistence\ManagerRegistry; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Request; @@ -75,7 +75,7 @@ public function create(Request $request, ManagerRegistry $doctrine): Response if ($form->isSubmitted() && $form->isValid()) { $data = $form->getData(); - $this->bus->dispatch(new CreateDinosaur( + $this->bus->dispatch(new Create( name: $data->getName(), gender: $data->getGender(), eyesColor: $data->getEyesColor(), @@ -115,7 +115,7 @@ public function edit(Request $request, int $id, ManagerRegistry $doctrine): Resp if ($form->isSubmitted() && $form->isValid()) { $data = $form->getData(); - $this->bus->dispatch(new EditDinosaur( + $this->bus->dispatch(new Edit( id: $id, name: $data->getName(), gender: $data->getGender(), @@ -141,7 +141,7 @@ public function edit(Request $request, int $id, ManagerRegistry $doctrine): Resp )] public function remove(int $id): Response { - $this->bus->dispatch(new DeleteDinosaur($id)); + $this->bus->dispatch(new Delete($id)); $this->addFlash('success', 'The dinosaur has been removed!'); diff --git a/src/Controller/SpeciesController.php b/src/Controller/SpeciesController.php index 972f0a9..13104f6 100644 --- a/src/Controller/SpeciesController.php +++ b/src/Controller/SpeciesController.php @@ -4,9 +4,9 @@ use App\Entity\Species; use App\Form\Type\SpeciesType; -use App\Message\CreateSpecies; -use App\Message\DeleteSpecies; -use App\Message\EditSpecies; +use App\Message\Species\Delete; +use App\Message\Species\Edit; +use App\Message\Species\Create; use Doctrine\Persistence\ManagerRegistry; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Request; @@ -42,7 +42,7 @@ public function create(Request $request, ManagerRegistry $doctrine): Response if ($form->isSubmitted() && $form->isValid()) { $data = $form->getData(); - $this->bus->dispatch(new CreateSpecies( + $this->bus->dispatch(new Create( name: $data->getName(), feeding: $data->getFeeding(), habitats: $data->getHabitats() @@ -80,7 +80,7 @@ public function edit(Request $request, int $id, ManagerRegistry $doctrine): Resp if ($form->isSubmitted() && $form->isValid()) { $data = $form->getData(); - $this->bus->dispatch(new EditSpecies( + $this->bus->dispatch(new Edit( id: $id, name: $data->getName(), feeding: $data->getFeeding(), @@ -104,7 +104,7 @@ public function edit(Request $request, int $id, ManagerRegistry $doctrine): Resp )] public function remove(int $id): Response { - $this->bus->dispatch(new DeleteSpecies($id)); + $this->bus->dispatch(new Delete($id)); $this->addFlash('success', 'The species has been removed!'); diff --git a/src/Message/CreateDinosaur.php b/src/Message/CreateDinosaur.php deleted file mode 100644 index a59011f..0000000 --- a/src/Message/CreateDinosaur.php +++ /dev/null @@ -1,40 +0,0 @@ -name; - } - - public function getGender(): string - { - return $this->gender; - } - - public function getEyesColor(): string - { - return $this->eyesColor; - } - - public function getAge(): int - { - return $this->age; - } - - public function getSpeciesId(): int - { - return $this->speciesId; - } -} diff --git a/src/Message/CreateSpecies.php b/src/Message/CreateSpecies.php deleted file mode 100644 index a79e82a..0000000 --- a/src/Message/CreateSpecies.php +++ /dev/null @@ -1,28 +0,0 @@ -name; - } - - public function getFeeding(): string - { - return $this->feeding; - } - - public function getHabitats(): array - { - return $this->habitats; - } -} diff --git a/src/Message/DeleteDinosaur.php b/src/Message/DeleteDinosaur.php deleted file mode 100644 index 92fed97..0000000 --- a/src/Message/DeleteDinosaur.php +++ /dev/null @@ -1,15 +0,0 @@ -id; - } -} diff --git a/src/Message/DeleteSpecies.php b/src/Message/DeleteSpecies.php deleted file mode 100644 index 7821233..0000000 --- a/src/Message/DeleteSpecies.php +++ /dev/null @@ -1,15 +0,0 @@ -id; - } -} diff --git a/src/Message/Dinosaur/Create.php b/src/Message/Dinosaur/Create.php new file mode 100644 index 0000000..4b8937a --- /dev/null +++ b/src/Message/Dinosaur/Create.php @@ -0,0 +1,15 @@ +id; - } - - public function getName(): string - { - return $this->name; - } - - public function getGender(): string - { - return $this->gender; - } - - public function getEyesColor(): string - { - return $this->eyesColor; - } - - public function getAge(): int - { - return $this->age; - } - - public function getSpeciesId(): int - { - return $this->speciesId; - } -} diff --git a/src/Message/EditSpecies.php b/src/Message/EditSpecies.php deleted file mode 100644 index 8817de5..0000000 --- a/src/Message/EditSpecies.php +++ /dev/null @@ -1,34 +0,0 @@ -id; - } - - public function getName(): string - { - return $this->name; - } - - public function getFeeding(): string - { - return $this->feeding; - } - - public function getHabitats(): array - { - return $this->habitats; - } -} diff --git a/src/Message/Species/Create.php b/src/Message/Species/Create.php new file mode 100644 index 0000000..ebed929 --- /dev/null +++ b/src/Message/Species/Create.php @@ -0,0 +1,13 @@ +getName(), - habitats: $message->getHabitats(), - feeding: $message->getFeeding() - ); - - $this->entityManager->persist($species); - $this->entityManager->flush(); - } -} diff --git a/src/MessageHandler/CreateDinosaurHandler.php b/src/MessageHandler/Dinosaur/Create.php similarity index 50% rename from src/MessageHandler/CreateDinosaurHandler.php rename to src/MessageHandler/Dinosaur/Create.php index 2897bbd..cc75747 100644 --- a/src/MessageHandler/CreateDinosaurHandler.php +++ b/src/MessageHandler/Dinosaur/Create.php @@ -1,34 +1,35 @@ entityManager->getRepository(Species::class); - if (!$species = $speciesRepository->find($message->getSpeciesId())) { - throw new NotFoundHttpException("Species with id {$message->getSpeciesId()} not found"); + if (!$species = $speciesRepository->find($message->speciesId)) { + throw new NotFoundHttpException("Species with id {$message->speciesId} not found"); } $dino = new Dinosaur( - name: $message->getName(), - gender: $message->getGender(), + name: $message->name, + gender: $message->gender, species: $species, - age: $message->getAge(), - eyesColor: $message->getEyesColor() + age: $message->age, + eyesColor: $message->eyesColor ); $this->entityManager->persist($dino); diff --git a/src/MessageHandler/DeleteDinosaurHandler.php b/src/MessageHandler/Dinosaur/Delete.php similarity index 55% rename from src/MessageHandler/DeleteDinosaurHandler.php rename to src/MessageHandler/Dinosaur/Delete.php index 324874d..993d6d9 100644 --- a/src/MessageHandler/DeleteDinosaurHandler.php +++ b/src/MessageHandler/Dinosaur/Delete.php @@ -1,25 +1,26 @@ entityManager->getRepository(Dinosaur::class); - if (!$dinosaur = $dinoRepository->find($message->getId())) { - throw new NotFoundHttpException("Dinosaur with id {$message->getId()} not found"); + if (!$dinosaur = $dinoRepository->find($message->id)) { + throw new NotFoundHttpException("Dinosaur with id {$message->id} not found"); } $this->entityManager->remove($dinosaur); diff --git a/src/MessageHandler/Dinosaur/Edit.php b/src/MessageHandler/Dinosaur/Edit.php new file mode 100644 index 0000000..6dabba6 --- /dev/null +++ b/src/MessageHandler/Dinosaur/Edit.php @@ -0,0 +1,39 @@ +entityManager->getRepository(Dinosaur::class); + $speciesRepository = $this->entityManager->getRepository(Species::class); + + if (!$dinosaur = $dinosaurRepository->find($message->id)) { + throw new NotFoundHttpException("Dinosaur with id {$message->id} not found"); + } + + if (!$species = $speciesRepository->find($message->speciesId)) { + throw new NotFoundHttpException("Species with id {$message->id} not found"); + } + + $dinosaur->setName($message->name); + $dinosaur->setEyesColor($message->eyesColor); + $dinosaur->setAge($message->age); + $dinosaur->setSpecies($species); + + $this->entityManager->flush(); + } +} diff --git a/src/MessageHandler/EditDinosaurHandler.php b/src/MessageHandler/EditDinosaurHandler.php deleted file mode 100644 index 02360e6..0000000 --- a/src/MessageHandler/EditDinosaurHandler.php +++ /dev/null @@ -1,40 +0,0 @@ -entityManager->getRepository(Dinosaur::class); - $speciesRepository = $this->entityManager->getRepository(Species::class); - - /** @var Dinosaur $dinosaur */ - if (!$dinosaur = $dinosaurRepository->find($message->getId())) { - throw new NotFoundHttpException("Dinosaur with id {$message->getId()} not found"); - } - - /** @var Species $species */ - if (!$species = $speciesRepository->find($message->getSpeciesId())) { - throw new NotFoundHttpException("Species with id {$message->getSpeciesId()} not found"); - } - - $dinosaur->setName($message->getName()); - $dinosaur->setEyesColor($message->getEyesColor()); - $dinosaur->setAge($message->getAge()); - $dinosaur->setSpecies($species); - - $this->entityManager->flush(); - } -} diff --git a/src/MessageHandler/EditSpeciesHandler.php b/src/MessageHandler/EditSpeciesHandler.php deleted file mode 100644 index 54744de..0000000 --- a/src/MessageHandler/EditSpeciesHandler.php +++ /dev/null @@ -1,31 +0,0 @@ -entityManager->getRepository(Species::class); - - if (!$species = $speciesRepository->find($message->getId())) { - throw new NotFoundHttpException("Species with id {$message->getId()} not found"); - } - - $species->setName($message->getName()); - $species->setFeeding($message->getFeeding()); - $species->setHabitats($message->getHabitats()); - - $this->entityManager->flush(); - } -} diff --git a/src/MessageHandler/Species/Create.php b/src/MessageHandler/Species/Create.php new file mode 100644 index 0000000..f54d57d --- /dev/null +++ b/src/MessageHandler/Species/Create.php @@ -0,0 +1,28 @@ +name, + habitats: $message->habitats, + feeding: $message->feeding + ); + + $this->entityManager->persist($species); + $this->entityManager->flush(); + } +} diff --git a/src/MessageHandler/DeleteSpeciesHandler.php b/src/MessageHandler/Species/Delete.php similarity index 59% rename from src/MessageHandler/DeleteSpeciesHandler.php rename to src/MessageHandler/Species/Delete.php index e9b95f1..f3cc756 100644 --- a/src/MessageHandler/DeleteSpeciesHandler.php +++ b/src/MessageHandler/Species/Delete.php @@ -3,23 +3,24 @@ namespace App\MessageHandler; use App\Entity\Species; -use App\Message\DeleteSpecies; +use App\Message\Species\Delete as DeleteMessage; use Doctrine\ORM\EntityManagerInterface; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; use Symfony\Component\Messenger\Handler\MessageHandlerInterface; -final class DeleteSpeciesHandler implements MessageHandlerInterface +final class Delete implements MessageHandlerInterface { - public function __construct(private EntityManagerInterface $entityManager) - { + public function __construct( + private EntityManagerInterface $entityManager + ) { } - public function __invoke(DeleteSpecies $message) + public function __invoke(DeleteMessage $message) { $speciesRepository = $this->entityManager->getRepository(Species::class); - if (!$species = $speciesRepository->find($message->getId())) { - throw new NotFoundHttpException("Species with id {$message->getId()} not found"); + if (!$species = $speciesRepository->find($message->id)) { + throw new NotFoundHttpException("Species with id {$message->id} not found"); } $this->entityManager->remove($species); diff --git a/src/MessageHandler/Species/Edit.php b/src/MessageHandler/Species/Edit.php new file mode 100644 index 0000000..cda92d1 --- /dev/null +++ b/src/MessageHandler/Species/Edit.php @@ -0,0 +1,32 @@ +entityManager->getRepository(Species::class); + + if (!$species = $speciesRepository->find($message->id)) { + throw new NotFoundHttpException("Species with id {$message->id} not found"); + } + + $species->setName($message->name); + $species->setFeeding($message->feeding); + $species->setHabitats($message->habitats); + + $this->entityManager->flush(); + } +} From e2b20e74e10120c7adc0bbad2cb45ce1f80571a4 Mon Sep 17 00:00:00 2001 From: ErwannLeRoux Date: Thu, 9 Feb 2023 09:33:49 +0100 Subject: [PATCH 04/10] feat: introduce food consumption exercise --- config/doctrine/orm/Dinosaur.orm.xml | 5 +++ config/doctrine/orm/Park.orm.xml | 22 ++++++++++ config/packages/messenger.yaml | 22 ++++++++-- migrations/Version20230208124132.php | 29 +++++++++++++ src/Command/ConsumeCommand.php | 47 +++++++++++++++++++++ src/Command/RefillCommand.php | 37 ++++++++++++++++ src/Controller/DinosaursController.php | 3 +- src/Entity/Dinosaur.php | 13 +++++- src/Entity/Park.php | 58 ++++++++++++++++++++++++++ src/Form/Type/DinosaurType.php | 6 +++ src/Message/Dinosaur/Create.php | 3 +- src/Message/Food/Consume.php | 13 ++++++ src/Message/Food/Refill.php | 9 ++++ src/MessageHandler/Dinosaur/Create.php | 9 +++- src/MessageHandler/Food/Consume.php | 53 +++++++++++++++++++++++ src/MessageHandler/Food/Refill.php | 42 +++++++++++++++++++ 16 files changed, 363 insertions(+), 8 deletions(-) create mode 100644 config/doctrine/orm/Park.orm.xml create mode 100644 migrations/Version20230208124132.php create mode 100644 src/Command/ConsumeCommand.php create mode 100644 src/Command/RefillCommand.php create mode 100644 src/Entity/Park.php create mode 100644 src/Message/Food/Consume.php create mode 100644 src/Message/Food/Refill.php create mode 100644 src/MessageHandler/Food/Consume.php create mode 100644 src/MessageHandler/Food/Refill.php diff --git a/config/doctrine/orm/Dinosaur.orm.xml b/config/doctrine/orm/Dinosaur.orm.xml index 2dd902f..e1f769d 100644 --- a/config/doctrine/orm/Dinosaur.orm.xml +++ b/config/doctrine/orm/Dinosaur.orm.xml @@ -24,6 +24,11 @@ target-entity="App\Entity\Species" inversed-by="dinosaurs" /> + + diff --git a/config/doctrine/orm/Park.orm.xml b/config/doctrine/orm/Park.orm.xml new file mode 100644 index 0000000..f7eb600 --- /dev/null +++ b/config/doctrine/orm/Park.orm.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/config/packages/messenger.yaml b/config/packages/messenger.yaml index 86c7d52..acf5e6b 100644 --- a/config/packages/messenger.yaml +++ b/config/packages/messenger.yaml @@ -1,8 +1,22 @@ framework: messenger: + failure_transport: failed transports: - async: '%env(MESSENGER_TRANSPORT_DSN)%' + async_high_priority: + dsn: '%env(MESSENGER_TRANSPORT_DSN)%' + options: + queue_name: high_priority + async_low_priority: + dsn: '%env(MESSENGER_TRANSPORT_DSN)%' + options: + queue_name: low_priority + failed: + dsn: '%env(MESSENGER_TRANSPORT_DSN)%' + options: + queue_name: failed routing: - 'App\Message\Dinosaur\Create': async - 'App\Message\Dinosaur\Edit': async - 'App\Message\Dinosaur\Delete': async + 'App\Message\Dinosaur\Create': async_low_priority + 'App\Message\Dinosaur\Edit': async_low_priority + 'App\Message\Dinosaur\Delete': async_low_priority + 'App\Message\Food\Consume': async_low_priority + 'App\Message\Food\Refill': async_high_priority diff --git a/migrations/Version20230208124132.php b/migrations/Version20230208124132.php new file mode 100644 index 0000000..7e3d23f --- /dev/null +++ b/migrations/Version20230208124132.php @@ -0,0 +1,29 @@ +addSql('CREATE TABLE park (id INT AUTO_INCREMENT NOT NULL, name VARCHAR(255) NOT NULL, food_amount INT NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB'); + $this->addSql('CREATE TABLE messenger_messages (id BIGINT AUTO_INCREMENT NOT NULL, body LONGTEXT NOT NULL, headers LONGTEXT NOT NULL, queue_name VARCHAR(190) NOT NULL, created_at DATETIME NOT NULL, available_at DATETIME NOT NULL, delivered_at DATETIME DEFAULT NULL, INDEX IDX_75EA56E0FB7336F0 (queue_name), INDEX IDX_75EA56E0E3BD61CE (available_at), INDEX IDX_75EA56E016BA31DB (delivered_at), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB'); + $this->addSql('ALTER TABLE dinosaur ADD park_id INT DEFAULT NULL'); + $this->addSql('ALTER TABLE dinosaur ADD CONSTRAINT FK_DAEDC56E44990C25 FOREIGN KEY (park_id) REFERENCES park (id)'); + $this->addSql('CREATE INDEX IDX_DAEDC56E44990C25 ON dinosaur (park_id)'); + } + + public function down(Schema $schema): void + { + $this->addSql('ALTER TABLE dinosaur DROP FOREIGN KEY FK_DAEDC56E44990C25'); + $this->addSql('DROP TABLE park'); + $this->addSql('DROP TABLE messenger_messages'); + $this->addSql('DROP INDEX IDX_DAEDC56E44990C25 ON dinosaur'); + $this->addSql('ALTER TABLE dinosaur DROP park_id'); + } +} diff --git a/src/Command/ConsumeCommand.php b/src/Command/ConsumeCommand.php new file mode 100644 index 0000000..ffca96c --- /dev/null +++ b/src/Command/ConsumeCommand.php @@ -0,0 +1,47 @@ +setDescription('Dispatch some food comsumption messages.') + ->setHelp('This command allows you dispatch some food consumptions messages...') + ; + } + + protected function execute(InputInterface $input, OutputInterface $output) + { + $dinosaurs = $this->dinosaurRepository->findAll(); + + for ($i = 0; $i < 10; $i++) { + $randomDinoKey = array_rand($dinosaurs); + + $message = new Consume($dinosaurs[$randomDinoKey]->getId()); + + $this->bus->dispatch($message); + } + + return Command::SUCCESS; + } +} diff --git a/src/Command/RefillCommand.php b/src/Command/RefillCommand.php new file mode 100644 index 0000000..dc84b9f --- /dev/null +++ b/src/Command/RefillCommand.php @@ -0,0 +1,37 @@ +setDescription('Dispatch a food refill message.') + ->setHelp('This command allows you to dispatch a food refill command...') + ; + } + + protected function execute(InputInterface $input, OutputInterface $output) + { + $this->bus->dispatch(new Refill()); + + return Command::SUCCESS; + } +} diff --git a/src/Controller/DinosaursController.php b/src/Controller/DinosaursController.php index 43b4a83..672c820 100644 --- a/src/Controller/DinosaursController.php +++ b/src/Controller/DinosaursController.php @@ -80,7 +80,8 @@ public function create(Request $request, ManagerRegistry $doctrine): Response gender: $data->getGender(), eyesColor: $data->getEyesColor(), age: $data->getAge(), - speciesId: $data->getSpecies()->getId() + speciesId: $data->getSpecies()->getId(), + parkId: $data->getPark()->getId() )); $this->addFlash('success', 'The dinosaur has been created!'); diff --git a/src/Entity/Dinosaur.php b/src/Entity/Dinosaur.php index b11a447..b45c074 100644 --- a/src/Entity/Dinosaur.php +++ b/src/Entity/Dinosaur.php @@ -11,7 +11,8 @@ public function __construct( private string $gender, private Species $species, private int $age, - private string $eyesColor + private string $eyesColor, + private Park $park ) { } @@ -69,4 +70,14 @@ public function setEyesColor(string $eyesColor): void { $this->eyesColor = $eyesColor; } + + public function getPark(): Park + { + return $this->park; + } + + public function setPark(Park $park): void + { + $this->park = $park; + } } diff --git a/src/Entity/Park.php b/src/Entity/Park.php new file mode 100644 index 0000000..31180a0 --- /dev/null +++ b/src/Entity/Park.php @@ -0,0 +1,58 @@ +name = $name; + $this->foodAmount = $foodAmount; + $this->dinosaurs = []; + } + + public function addDinosaurs(Dinosaur ...$dinosaur): void + { + $this->dinosaurs[] = $dinosaur; + } + + public function getId(): int + { + return $this->id; + } + + public function getName(): string + { + return $this->name; + } + + public function getFoodAmount(): int + { + return $this->foodAmount; + } + + public function setFoodAmount(int $foodAmount): void + { + $this->foodAmount = $foodAmount; + } + + public function getDinosaurs() + { + return $this->dinosaurs; + } +} diff --git a/src/Form/Type/DinosaurType.php b/src/Form/Type/DinosaurType.php index 9640754..73c0851 100644 --- a/src/Form/Type/DinosaurType.php +++ b/src/Form/Type/DinosaurType.php @@ -3,6 +3,7 @@ namespace App\Form\Type; use App\Entity\Dinosaur; +use App\Entity\Park; use App\Entity\Species; use Symfony\Bridge\Doctrine\Form\Type\EntityType; use Symfony\Component\Form\AbstractType; @@ -30,6 +31,10 @@ public function buildForm(FormBuilderInterface $builder, array $options): void 'class' => Species::class, 'choice_label' => 'name', ]) + ->add('park', EntityType::class, [ + 'class' => Park::class, + 'choice_label' => 'name' + ]) ->add('age', NumberType::class) ->add('eyesColor', ColorType::class) ->add('submit', SubmitType::class); @@ -46,6 +51,7 @@ public function configureOptions(OptionsResolver $resolver): void $form->get('species')->getData(), $form->get('age')->getData(), $form->get('eyesColor')->getData(), + $form->get('park')->getData() ); }, ]); diff --git a/src/Message/Dinosaur/Create.php b/src/Message/Dinosaur/Create.php index 4b8937a..5ccc485 100644 --- a/src/Message/Dinosaur/Create.php +++ b/src/Message/Dinosaur/Create.php @@ -9,7 +9,8 @@ public function __construct( public readonly string $gender, public readonly string $eyesColor, public readonly int $age, - public readonly int $speciesId + public readonly int $speciesId, + public readonly int $parkId, ) { } } diff --git a/src/Message/Food/Consume.php b/src/Message/Food/Consume.php new file mode 100644 index 0000000..a04066f --- /dev/null +++ b/src/Message/Food/Consume.php @@ -0,0 +1,13 @@ +entityManager->getRepository(Species::class); + $parkRepository = $this->entityManager->getRepository(Park::class); if (!$species = $speciesRepository->find($message->speciesId)) { throw new NotFoundHttpException("Species with id {$message->speciesId} not found"); } + if (!$park = $parkRepository->find($message->parkId)) { + throw new NotFoundHttpException("Park with id {$message->parkId} not found"); + } + $dino = new Dinosaur( name: $message->name, gender: $message->gender, species: $species, age: $message->age, - eyesColor: $message->eyesColor + eyesColor: $message->eyesColor, + park: $park ); $this->entityManager->persist($dino); diff --git a/src/MessageHandler/Food/Consume.php b/src/MessageHandler/Food/Consume.php new file mode 100644 index 0000000..1c108af --- /dev/null +++ b/src/MessageHandler/Food/Consume.php @@ -0,0 +1,53 @@ +dinosaurId; + + $dinosaursRepository = $this->em->getRepository(Dinosaur::class); + + $dinosaur = $dinosaursRepository->find($dinosaurId); + + $park = $dinosaur->getPark(); + + $consumedAmout = random_int(1, 10); + + if ($consumedAmout > $park->getFoodAmount()) { + throw new DomainException(sprintf( + 'Not enough food to feed %s', + $dinosaur->getName() + )); + } + + $this->logger->info(sprintf( + '%s is consuming %d stacks of food. He needs to rest...', + $dinosaur->getName(), + $consumedAmout + )); + + sleep($consumedAmout); + + $park->setFoodAmount($park->getFoodAmount() - $consumedAmout); + + $this->em->flush(); + } +} diff --git a/src/MessageHandler/Food/Refill.php b/src/MessageHandler/Food/Refill.php new file mode 100644 index 0000000..eda1969 --- /dev/null +++ b/src/MessageHandler/Food/Refill.php @@ -0,0 +1,42 @@ +logger->info('Refilling food'); + + $parkRepository = $this->entityManager->getRepository(Park::class); + + $parks = $parkRepository->findAll(); + + $dinosaurIsAttacking = random_int(0, 10); + + if ($dinosaurIsAttacking < 5) { + throw new DomainException('Dinosaur is attacking cannot refill food'); + } + + foreach ($parks as $park) { + $park->setFoodAmount(100); + } + + $this->entityManager->flush(); + } +} From 4596fc729f7c0fc912c2e71398817e6d62deb1b4 Mon Sep 17 00:00:00 2001 From: ErwannLeRoux Date: Thu, 9 Feb 2023 17:15:54 +0100 Subject: [PATCH 05/10] feat: introducing custom middelware and lock stamp --- .env.dist | 6 +++ composer.json | 1 + composer.lock | 79 ++++++++++++++++++++++++++++++- config/packages/lock.yaml | 2 + config/packages/messenger.yaml | 46 ++++++++++-------- src/Command/ConsumeCommand.php | 8 ++-- src/Message/Food/Consume.php | 3 +- src/Middleware/LockMiddleware.php | 48 +++++++++++++++++++ src/Stamp/LockStamp.php | 15 ++++++ symfony.lock | 12 +++++ 10 files changed, 195 insertions(+), 25 deletions(-) create mode 100644 config/packages/lock.yaml create mode 100644 src/Middleware/LockMiddleware.php create mode 100644 src/Stamp/LockStamp.php diff --git a/.env.dist b/.env.dist index 9c035fe..28137cc 100644 --- a/.env.dist +++ b/.env.dist @@ -14,3 +14,9 @@ MYSQL_PASSWORD=password # MESSENGER_TRANSPORT_DSN=amqp://guest:guest@localhost:5672/%2f/messages # MESSENGER_TRANSPORT_DSN=redis://localhost:6379/messages ###< symfony/messenger ### + +###> symfony/lock ### +# Choose one of the stores below +# postgresql+advisory://db_user:db_password@localhost/db_name +LOCK_DSN=flock +###< symfony/lock ### diff --git a/composer.json b/composer.json index 55642f2..a6cb3f8 100644 --- a/composer.json +++ b/composer.json @@ -22,6 +22,7 @@ "symfony/framework-bundle": "^7.0", "symfony/http-client": "^7.0", "symfony/intl": "^7.0", + "symfony/lock": "^7.0", "symfony/mailer": "^7.0", "symfony/messenger": "^7.0", "symfony/mime": "^7.0", diff --git a/composer.lock b/composer.lock index fbb5810..2fedbd5 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "33b580876a3a71728728d8f42666f2fb", + "content-hash": "ba623841d394b605ff01f2d7a16e7b0a", "packages": [ { "name": "composer/package-versions-deprecated", @@ -4185,6 +4185,83 @@ ], "time": "2024-01-23T15:02:46+00:00" }, + { + "name": "symfony/lock", + "version": "v6.1.11", + "source": { + "type": "git", + "url": "https://github.com/symfony/lock.git", + "reference": "cbc3366559a568ed56d9e7ed6d8e29a083eebb5b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/lock/zipball/cbc3366559a568ed56d9e7ed6d8e29a083eebb5b", + "reference": "cbc3366559a568ed56d9e7ed6d8e29a083eebb5b", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/log": "^1|^2|^3" + }, + "conflict": { + "doctrine/dbal": "<2.13" + }, + "require-dev": { + "doctrine/dbal": "^2.13|^3.0", + "predis/predis": "~1.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Lock\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "JĂ©rĂ©my DerussĂ©", + "email": "jeremy@derusse.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Creates and manages locks, a mechanism to provide exclusive access to a shared resource", + "homepage": "https://symfony.com", + "keywords": [ + "cas", + "flock", + "locking", + "mutex", + "redlock", + "semaphore" + ], + "support": { + "source": "https://github.com/symfony/lock/tree/v6.1.11" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-01-01T08:36:55+00:00" + }, { "name": "symfony/mailer", "version": "v7.0.6", diff --git a/config/packages/lock.yaml b/config/packages/lock.yaml new file mode 100644 index 0000000..574879f --- /dev/null +++ b/config/packages/lock.yaml @@ -0,0 +1,2 @@ +framework: + lock: '%env(LOCK_DSN)%' diff --git a/config/packages/messenger.yaml b/config/packages/messenger.yaml index acf5e6b..e201c61 100644 --- a/config/packages/messenger.yaml +++ b/config/packages/messenger.yaml @@ -1,22 +1,28 @@ framework: messenger: - failure_transport: failed - transports: - async_high_priority: - dsn: '%env(MESSENGER_TRANSPORT_DSN)%' - options: - queue_name: high_priority - async_low_priority: - dsn: '%env(MESSENGER_TRANSPORT_DSN)%' - options: - queue_name: low_priority - failed: - dsn: '%env(MESSENGER_TRANSPORT_DSN)%' - options: - queue_name: failed - routing: - 'App\Message\Dinosaur\Create': async_low_priority - 'App\Message\Dinosaur\Edit': async_low_priority - 'App\Message\Dinosaur\Delete': async_low_priority - 'App\Message\Food\Consume': async_low_priority - 'App\Message\Food\Refill': async_high_priority + default_bus: command_bus + buses: + command_bus: + middleware: + - doctrine_transaction + - App\Middleware\LockMiddleware + failure_transport: failed + transports: + async_high_priority: + dsn: '%env(MESSENGER_TRANSPORT_DSN)%' + options: + queue_name: high_priority + async_low_priority: + dsn: '%env(MESSENGER_TRANSPORT_DSN)%' + options: + queue_name: low_priority + failed: + dsn: '%env(MESSENGER_TRANSPORT_DSN)%' + options: + queue_name: failed + routing: + 'App\Message\Dinosaur\Create': async_low_priority + 'App\Message\Dinosaur\Edit': async_low_priority + 'App\Message\Dinosaur\Delete': async_low_priority + 'App\Message\Food\Consume': async_low_priority + 'App\Message\Food\Refill': async_high_priority diff --git a/src/Command/ConsumeCommand.php b/src/Command/ConsumeCommand.php index ffca96c..63d4a03 100644 --- a/src/Command/ConsumeCommand.php +++ b/src/Command/ConsumeCommand.php @@ -34,12 +34,14 @@ protected function execute(InputInterface $input, OutputInterface $output) { $dinosaurs = $this->dinosaurRepository->findAll(); - for ($i = 0; $i < 10; $i++) { + for ($i = 0; $i < 100; $i++) { $randomDinoKey = array_rand($dinosaurs); - $message = new Consume($dinosaurs[$randomDinoKey]->getId()); + $dinosaur = $dinosaurs[$randomDinoKey]; - $this->bus->dispatch($message); + $consumeMessage = new Consume($dinosaur->getId(), $dinosaur->getName()); + + $this->bus->dispatch($consumeMessage); } return Command::SUCCESS; diff --git a/src/Message/Food/Consume.php b/src/Message/Food/Consume.php index a04066f..860670a 100644 --- a/src/Message/Food/Consume.php +++ b/src/Message/Food/Consume.php @@ -7,7 +7,8 @@ class Consume { public function __construct( - public readonly int $dinosaurId + public readonly int $dinosaurId, + public readonly string $dinosaurName ) { } } diff --git a/src/Middleware/LockMiddleware.php b/src/Middleware/LockMiddleware.php new file mode 100644 index 0000000..e753265 --- /dev/null +++ b/src/Middleware/LockMiddleware.php @@ -0,0 +1,48 @@ +getMessage(); + + if ([] === $envelope->all(LockStamp::class)) { + $envelope = $envelope->with(new LockStamp( + $message->dinosaurId + )); + + return $stack->next()->handle($envelope, $stack); + } + + /** @var LockStamp $lockStamp */ + $lockStamp = $envelope->last(LockStamp::class); + + $lock = $this->lockFactory->createLock((string) $lockStamp->lockKey); + + if ($lock->acquire()) { + $return = $stack->next()->handle($envelope, $stack); + + $lock->release(); + + return $return; + } + + throw new RuntimeException("Unable to acquire the lock for {$message->dinosaurName}"); + } +} diff --git a/src/Stamp/LockStamp.php b/src/Stamp/LockStamp.php new file mode 100644 index 0000000..7a14098 --- /dev/null +++ b/src/Stamp/LockStamp.php @@ -0,0 +1,15 @@ + Date: Mon, 13 Feb 2023 13:26:25 +0100 Subject: [PATCH 06/10] refactor: use LockableInterface and remove deprecations --- config/packages/messenger.yaml | 3 - src/Controller/DinosaursController.php | 10 ++- src/Controller/SpeciesController.php | 10 ++- src/EventListener/WorkerListener.php | 84 ++++++++++++++++++++++++++ src/Message/Food/Consume.php | 4 +- src/Message/Lockable.php | 9 +++ src/MessageHandler/Dinosaur/Create.php | 10 ++- src/MessageHandler/Dinosaur/Delete.php | 7 ++- src/MessageHandler/Dinosaur/Edit.php | 8 ++- src/MessageHandler/Food/Consume.php | 5 +- src/MessageHandler/Food/Refill.php | 5 +- src/MessageHandler/Species/Create.php | 10 ++- src/MessageHandler/Species/Delete.php | 5 +- src/MessageHandler/Species/Edit.php | 5 +- src/MessageResults/Dinosaur/Create.php | 13 ++++ src/MessageResults/Species/Create.php | 13 ++++ src/Middleware/LockMiddleware.php | 5 ++ 17 files changed, 178 insertions(+), 28 deletions(-) create mode 100644 src/EventListener/WorkerListener.php create mode 100644 src/Message/Lockable.php create mode 100644 src/MessageResults/Dinosaur/Create.php create mode 100644 src/MessageResults/Species/Create.php diff --git a/config/packages/messenger.yaml b/config/packages/messenger.yaml index e201c61..c02fdca 100644 --- a/config/packages/messenger.yaml +++ b/config/packages/messenger.yaml @@ -21,8 +21,5 @@ framework: options: queue_name: failed routing: - 'App\Message\Dinosaur\Create': async_low_priority - 'App\Message\Dinosaur\Edit': async_low_priority - 'App\Message\Dinosaur\Delete': async_low_priority 'App\Message\Food\Consume': async_low_priority 'App\Message\Food\Refill': async_high_priority diff --git a/src/Controller/DinosaursController.php b/src/Controller/DinosaursController.php index 672c820..4194819 100644 --- a/src/Controller/DinosaursController.php +++ b/src/Controller/DinosaursController.php @@ -13,6 +13,7 @@ use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Messenger\MessageBusInterface; +use Symfony\Component\Messenger\Stamp\HandledStamp; use Symfony\Component\Routing\Annotation\Route; final class DinosaursController extends AbstractController @@ -75,7 +76,7 @@ public function create(Request $request, ManagerRegistry $doctrine): Response if ($form->isSubmitted() && $form->isValid()) { $data = $form->getData(); - $this->bus->dispatch(new Create( + $envelop = $this->bus->dispatch(new Create( name: $data->getName(), gender: $data->getGender(), eyesColor: $data->getEyesColor(), @@ -84,7 +85,12 @@ public function create(Request $request, ManagerRegistry $doctrine): Response parkId: $data->getPark()->getId() )); - $this->addFlash('success', 'The dinosaur has been created!'); + $result = $envelop->last(HandledStamp::class)->getResult(); + + $this->addFlash('success', sprintf( + 'The dinosaur with id %s has been created!', + $result->id + )); return $this->redirectToRoute('app_list_dinosaurs'); } diff --git a/src/Controller/SpeciesController.php b/src/Controller/SpeciesController.php index 13104f6..023ef91 100644 --- a/src/Controller/SpeciesController.php +++ b/src/Controller/SpeciesController.php @@ -12,6 +12,7 @@ use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Messenger\MessageBusInterface; +use Symfony\Component\Messenger\Stamp\HandledStamp; use Symfony\Component\Routing\Annotation\Route; final class SpeciesController extends AbstractController @@ -42,13 +43,18 @@ public function create(Request $request, ManagerRegistry $doctrine): Response if ($form->isSubmitted() && $form->isValid()) { $data = $form->getData(); - $this->bus->dispatch(new Create( + $envelop = $this->bus->dispatch(new Create( name: $data->getName(), feeding: $data->getFeeding(), habitats: $data->getHabitats() )); - $this->addFlash('success', 'The species has been created!'); + $result = $envelop->last(HandledStamp::class)->getResult(); + + $this->addFlash('success', sprintf( + 'The species with id %s has been created!', + $result->id + )); return $this->redirectToRoute('app_list_species'); } diff --git a/src/EventListener/WorkerListener.php b/src/EventListener/WorkerListener.php new file mode 100644 index 0000000..5a82e5e --- /dev/null +++ b/src/EventListener/WorkerListener.php @@ -0,0 +1,84 @@ +getWorker()->getMetadata()->getTransportNames(); + + $this->logger->log(LogLevel::NOTICE, sprintf( + 'Worker started. Transports priority : [%s]', + implode(', ', $transports) + )); + } + + public function onWorkerStoppedEvent(WorkerStoppedEvent $event) + { + $this->logger->log(LogLevel::NOTICE, 'Worker stopped'); + } + + public function onWorkerMessageReceivedEvent(WorkerMessageReceivedEvent $event) + { + $envelope = $event->getEnvelope(); + + $message = $envelope->getMessage(); + $messageClass = get_class($message); + + $this->logger->log(LogLevel::NOTICE, sprintf('Received message %s', $messageClass)); + } + + public function onWorkerMessageHandledEvent(WorkerMessageHandledEvent $event) + { + $envelope = $event->getEnvelope(); + + $handledStamp = $envelope->last(HandledStamp::class); + + $handlerName = $handledStamp->getHandlerName(); + + $message = $envelope->getMessage(); + $messageClass = get_class($message); + + $this->logger->log(LogLevel::NOTICE, sprintf('Message %s handled by %s', $messageClass, $handlerName)); + } + + public function onWorkerMessageFailedEvent(WorkerMessageFailedEvent $event) + { + $envelope = $event->getEnvelope(); + + $message = $envelope->getMessage(); + $messageClass = get_class($message); + + $this->logger->log(LogLevel::CRITICAL, sprintf('Message %s failed', $messageClass)); + } + + public function onWorkerRunningEvent() + { + $this->logger->log(LogLevel::NOTICE, 'Worker is running. Waiting for messages...'); + } +} diff --git a/src/Message/Food/Consume.php b/src/Message/Food/Consume.php index 860670a..336f2ac 100644 --- a/src/Message/Food/Consume.php +++ b/src/Message/Food/Consume.php @@ -4,7 +4,9 @@ namespace App\Message\Food; -class Consume +use App\Message\Lockable; + +class Consume implements Lockable { public function __construct( public readonly int $dinosaurId, diff --git a/src/Message/Lockable.php b/src/Message/Lockable.php new file mode 100644 index 0000000..f6f002d --- /dev/null +++ b/src/Message/Lockable.php @@ -0,0 +1,9 @@ +entityManager->getRepository(Species::class); $parkRepository = $this->entityManager->getRepository(Park::class); @@ -41,5 +43,7 @@ public function __invoke(CreateMessage $message): void $this->entityManager->persist($dino); $this->entityManager->flush(); + + return new CreateMessageResult($dino->getId()); } } diff --git a/src/MessageHandler/Dinosaur/Delete.php b/src/MessageHandler/Dinosaur/Delete.php index 993d6d9..d130fb2 100644 --- a/src/MessageHandler/Dinosaur/Delete.php +++ b/src/MessageHandler/Dinosaur/Delete.php @@ -6,16 +6,17 @@ use App\Message\Dinosaur\Delete as DeleteMessage; use Doctrine\ORM\EntityManagerInterface; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; -use Symfony\Component\Messenger\Handler\MessageHandlerInterface; +use Symfony\Component\Messenger\Attribute\AsMessageHandler; -final class Delete implements MessageHandlerInterface +#[AsMessageHandler] +final class Delete { public function __construct( private EntityManagerInterface $entityManager ) { } - public function __invoke(DeleteMessage $message): void + public function __invoke(DeleteMessage $message) { $dinoRepository = $this->entityManager->getRepository(Dinosaur::class); diff --git a/src/MessageHandler/Dinosaur/Edit.php b/src/MessageHandler/Dinosaur/Edit.php index 6dabba6..83899e6 100644 --- a/src/MessageHandler/Dinosaur/Edit.php +++ b/src/MessageHandler/Dinosaur/Edit.php @@ -5,18 +5,20 @@ use App\Entity\Dinosaur; use App\Entity\Species; use App\Message\Dinosaur\Edit as EditMessage; +use App\MessageResults\Dinosaur\Edit as EditOutput; use Doctrine\ORM\EntityManagerInterface; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; -use Symfony\Component\Messenger\Handler\MessageHandlerInterface; +use Symfony\Component\Messenger\Attribute\AsMessageHandler; -final class Edit implements MessageHandlerInterface +#[AsMessageHandler] +final class Edit { public function __construct( private EntityManagerInterface $entityManager ) { } - public function __invoke(EditMessage $message): void + public function __invoke(EditMessage $message) { $dinosaurRepository = $this->entityManager->getRepository(Dinosaur::class); $speciesRepository = $this->entityManager->getRepository(Species::class); diff --git a/src/MessageHandler/Food/Consume.php b/src/MessageHandler/Food/Consume.php index 1c108af..05c6617 100644 --- a/src/MessageHandler/Food/Consume.php +++ b/src/MessageHandler/Food/Consume.php @@ -9,9 +9,10 @@ use Doctrine\ORM\EntityManagerInterface; use DomainException; use Psr\Log\LoggerInterface; -use Symfony\Component\Messenger\Handler\MessageHandlerInterface; +use Symfony\Component\Messenger\Attribute\AsMessageHandler; -class Consume implements MessageHandlerInterface +#[AsMessageHandler] +class Consume { public function __construct( private EntityManagerInterface $em, diff --git a/src/MessageHandler/Food/Refill.php b/src/MessageHandler/Food/Refill.php index eda1969..60cd8ff 100644 --- a/src/MessageHandler/Food/Refill.php +++ b/src/MessageHandler/Food/Refill.php @@ -9,9 +9,10 @@ use Doctrine\ORM\EntityManagerInterface; use DomainException; use Psr\Log\LoggerInterface; -use Symfony\Component\Messenger\Handler\MessageHandlerInterface; +use Symfony\Component\Messenger\Attribute\AsMessageHandler; -class Refill implements MessageHandlerInterface +#[AsMessageHandler] +class Refill { public function __construct( private LoggerInterface $logger, diff --git a/src/MessageHandler/Species/Create.php b/src/MessageHandler/Species/Create.php index f54d57d..7f4ceb0 100644 --- a/src/MessageHandler/Species/Create.php +++ b/src/MessageHandler/Species/Create.php @@ -4,17 +4,19 @@ use App\Entity\Species; use App\Message\Species\Create as CreateMessage; +use App\MessageResults\Species\Create as CreateMessageResult; use Doctrine\ORM\EntityManagerInterface; -use Symfony\Component\Messenger\Handler\MessageHandlerInterface; +use Symfony\Component\Messenger\Attribute\AsMessageHandler; -final class Create implements MessageHandlerInterface +#[AsMessageHandler] +final class Create { public function __construct( private EntityManagerInterface $entityManager ) { } - public function __invoke(CreateMessage $message): void + public function __invoke(CreateMessage $message): CreateMessageResult { $species = new Species( name: $message->name, @@ -24,5 +26,7 @@ public function __invoke(CreateMessage $message): void $this->entityManager->persist($species); $this->entityManager->flush(); + + return new CreateMessageResult($species->getId()); } } diff --git a/src/MessageHandler/Species/Delete.php b/src/MessageHandler/Species/Delete.php index f3cc756..2f71dbd 100644 --- a/src/MessageHandler/Species/Delete.php +++ b/src/MessageHandler/Species/Delete.php @@ -6,9 +6,10 @@ use App\Message\Species\Delete as DeleteMessage; use Doctrine\ORM\EntityManagerInterface; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; -use Symfony\Component\Messenger\Handler\MessageHandlerInterface; +use Symfony\Component\Messenger\Attribute\AsMessageHandler; -final class Delete implements MessageHandlerInterface +#[AsMessageHandler] +final class Delete { public function __construct( private EntityManagerInterface $entityManager diff --git a/src/MessageHandler/Species/Edit.php b/src/MessageHandler/Species/Edit.php index cda92d1..4f6a333 100644 --- a/src/MessageHandler/Species/Edit.php +++ b/src/MessageHandler/Species/Edit.php @@ -6,9 +6,10 @@ use App\Message\Species\Edit as EditMessage; use Doctrine\ORM\EntityManagerInterface; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; -use Symfony\Component\Messenger\Handler\MessageHandlerInterface; +use Symfony\Component\Messenger\Attribute\AsMessageHandler; -final class Edit implements MessageHandlerInterface +#[AsMessageHandler] +final class Edit { public function __construct( private EntityManagerInterface $entityManager diff --git a/src/MessageResults/Dinosaur/Create.php b/src/MessageResults/Dinosaur/Create.php new file mode 100644 index 0000000..f9b0bc8 --- /dev/null +++ b/src/MessageResults/Dinosaur/Create.php @@ -0,0 +1,13 @@ +getMessage(); + if (!$message instanceof Lockable) { + return $stack->next()->handle($envelope, $stack); + } + if ([] === $envelope->all(LockStamp::class)) { $envelope = $envelope->with(new LockStamp( $message->dinosaurId From 6aa05a6b1ebadd55836a78145b929e88fb248802 Mon Sep 17 00:00:00 2001 From: ErwannLeRoux Date: Mon, 13 Feb 2023 15:51:09 +0100 Subject: [PATCH 07/10] feat: build our own command bus --- config/services.yaml | 3 +++ src/Bus/CommandBus.php | 23 +++++++++++++++++++++++ src/Controller/DinosaursController.php | 12 +++++------- src/Controller/SpeciesController.php | 12 +++++------- 4 files changed, 36 insertions(+), 14 deletions(-) create mode 100644 src/Bus/CommandBus.php diff --git a/config/services.yaml b/config/services.yaml index 1d3246d..cf683d4 100644 --- a/config/services.yaml +++ b/config/services.yaml @@ -24,5 +24,8 @@ services: - '../src/Entity/' - '../src/Kernel.php' + App\Bus\CommandBus: + $messageBus: '@command_bus' + # add more service definitions when explicit configuration is needed # please note that last definitions always *replace* previous ones diff --git a/src/Bus/CommandBus.php b/src/Bus/CommandBus.php new file mode 100644 index 0000000..869ddb1 --- /dev/null +++ b/src/Bus/CommandBus.php @@ -0,0 +1,23 @@ +handle($input); + } +} diff --git a/src/Controller/DinosaursController.php b/src/Controller/DinosaursController.php index 4194819..5821fda 100644 --- a/src/Controller/DinosaursController.php +++ b/src/Controller/DinosaursController.php @@ -2,6 +2,7 @@ namespace App\Controller; +use App\Bus\CommandBus; use App\Entity\Dinosaur; use App\Form\Type\DinosaurType; use App\Form\Type\SearchType; @@ -12,14 +13,13 @@ use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; -use Symfony\Component\Messenger\MessageBusInterface; -use Symfony\Component\Messenger\Stamp\HandledStamp; use Symfony\Component\Routing\Annotation\Route; final class DinosaursController extends AbstractController { - public function __construct(private MessageBusInterface $bus) - { + public function __construct( + private CommandBus $bus + ) { } #[Route('/dinosaurs', name: 'app_list_dinosaurs')] @@ -76,7 +76,7 @@ public function create(Request $request, ManagerRegistry $doctrine): Response if ($form->isSubmitted() && $form->isValid()) { $data = $form->getData(); - $envelop = $this->bus->dispatch(new Create( + $result = $this->bus->dispatch(new Create( name: $data->getName(), gender: $data->getGender(), eyesColor: $data->getEyesColor(), @@ -85,8 +85,6 @@ public function create(Request $request, ManagerRegistry $doctrine): Response parkId: $data->getPark()->getId() )); - $result = $envelop->last(HandledStamp::class)->getResult(); - $this->addFlash('success', sprintf( 'The dinosaur with id %s has been created!', $result->id diff --git a/src/Controller/SpeciesController.php b/src/Controller/SpeciesController.php index 023ef91..e4f182a 100644 --- a/src/Controller/SpeciesController.php +++ b/src/Controller/SpeciesController.php @@ -2,6 +2,7 @@ namespace App\Controller; +use App\Bus\CommandBus; use App\Entity\Species; use App\Form\Type\SpeciesType; use App\Message\Species\Delete; @@ -11,14 +12,13 @@ use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; -use Symfony\Component\Messenger\MessageBusInterface; -use Symfony\Component\Messenger\Stamp\HandledStamp; use Symfony\Component\Routing\Annotation\Route; final class SpeciesController extends AbstractController { - public function __construct(private MessageBusInterface $bus) - { + public function __construct( + private CommandBus $bus + ) { } #[Route('/species', name: 'app_list_species')] @@ -43,14 +43,12 @@ public function create(Request $request, ManagerRegistry $doctrine): Response if ($form->isSubmitted() && $form->isValid()) { $data = $form->getData(); - $envelop = $this->bus->dispatch(new Create( + $result = $this->bus->dispatch(new Create( name: $data->getName(), feeding: $data->getFeeding(), habitats: $data->getHabitats() )); - $result = $envelop->last(HandledStamp::class)->getResult(); - $this->addFlash('success', sprintf( 'The species with id %s has been created!', $result->id From f2a9193b422527b83714eab81c7bd733d68bfb36 Mon Sep 17 00:00:00 2001 From: ErwannLeRoux Date: Tue, 14 Feb 2023 14:02:30 +0100 Subject: [PATCH 08/10] feat: deal with event bus (multiple buses) --- composer.json | 4 +- composer.lock | 1051 +++++++++++++++-- config/doctrine/orm/Park.orm.xml | 3 +- config/packages/messenger.yaml | 6 + config/services.yaml | 8 + docker-compose.yml | 13 +- src/Bus/CommandBus.php | 2 +- src/Event/AbstractEvent.php | 18 + src/Event/Dinosaur/HasBeenCreated.php | 11 + src/Event/Dinosaur/HasBeenDeleted.php | 11 + src/Event/Dinosaur/HasBeenUpdated.php | 11 + src/Event/Event.php | 10 + src/Event/Food/HasBeenConsumed.php | 11 + src/Event/Food/HasBeenRefilled.php | 11 + src/Event/Species/HasBeenCreated.php | 11 + src/Event/Species/HasBeenDeleted.php | 11 + src/Event/Species/HasBeenUpdated.php | 11 + .../Dinosaur/DeleteDinosaurSummary.php | 23 + .../Dinosaur/UpsertDinosaurSummary.php | 90 ++ src/Form/Type/DinosaurType.php | 1 + src/Indexer.php | 48 + src/MessageHandler/Dinosaur/Create.php | 36 +- src/MessageHandler/Dinosaur/Delete.php | 23 +- src/MessageHandler/Dinosaur/Edit.php | 12 +- src/MessageHandler/Food/Consume.php | 12 +- src/MessageHandler/Food/Refill.php | 14 +- src/MessageHandler/Species/Create.php | 22 +- src/MessageHandler/Species/Delete.php | 11 +- src/MessageHandler/Species/Edit.php | 23 +- src/Repository/DinosaurRepository.php | 5 + src/Repository/ParkRepository.php | 15 + src/Repository/SpeciesRepository.php | 5 + src/Stamp/LockStamp.php | 2 - 33 files changed, 1430 insertions(+), 115 deletions(-) create mode 100644 src/Event/AbstractEvent.php create mode 100644 src/Event/Dinosaur/HasBeenCreated.php create mode 100644 src/Event/Dinosaur/HasBeenDeleted.php create mode 100644 src/Event/Dinosaur/HasBeenUpdated.php create mode 100644 src/Event/Event.php create mode 100644 src/Event/Food/HasBeenConsumed.php create mode 100644 src/Event/Food/HasBeenRefilled.php create mode 100644 src/Event/Species/HasBeenCreated.php create mode 100644 src/Event/Species/HasBeenDeleted.php create mode 100644 src/Event/Species/HasBeenUpdated.php create mode 100644 src/EventHandler/Dinosaur/DeleteDinosaurSummary.php create mode 100644 src/EventHandler/Dinosaur/UpsertDinosaurSummary.php create mode 100644 src/Indexer.php create mode 100644 src/Repository/ParkRepository.php diff --git a/composer.json b/composer.json index a6cb3f8..8a99cf2 100644 --- a/composer.json +++ b/composer.json @@ -11,6 +11,7 @@ "doctrine/doctrine-bundle": "^2.12", "doctrine/doctrine-migrations-bundle": "^3.3", "doctrine/orm": "^3.1", + "elasticsearch/elasticsearch": "^8.6", "phpdocumentor/reflection-docblock": "^5.4", "symfony/asset": "^7.0", "symfony/console": "^7.0", @@ -57,7 +58,8 @@ }, "config": { "allow-plugins": { - "symfony/*": true + "symfony/*": true, + "php-http/discovery": true }, "optimize-autoloader": true, "preferred-install": { diff --git a/composer.lock b/composer.lock index 2fedbd5..16d2b54 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "ba623841d394b605ff01f2d7a16e7b0a", + "content-hash": "3782904a5950ea216badb0d03761a762", "packages": [ { "name": "composer/package-versions-deprecated", @@ -1358,7 +1358,110 @@ "type": "github" } ], - "time": "2023-10-06T06:47:41+00:00" + "time": "2022-06-18T20:57:19+00:00" + }, + { + "name": "elastic/transport", + "version": "v8.6.0", + "source": { + "type": "git", + "url": "git@github.com:elastic/elastic-transport-php.git", + "reference": "b1d761549cebddf2add49921ef67242897b635df" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/elastic/elastic-transport-php/zipball/b1d761549cebddf2add49921ef67242897b635df", + "reference": "b1d761549cebddf2add49921ef67242897b635df", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2.0", + "php": "^7.4 || ^8.0", + "php-http/discovery": "^1.14", + "php-http/httplug": "^2.3", + "psr/http-client": "^1.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0", + "psr/log": "^1 || ^2 || ^3" + }, + "require-dev": { + "nyholm/psr7": "^1.5", + "php-http/mock-client": "^1.5", + "phpstan/phpstan": "^1.4", + "phpunit/phpunit": "^9.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Elastic\\Transport\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "HTTP transport PHP library for Elastic products", + "keywords": [ + "PSR_17", + "elastic", + "http", + "psr-18", + "psr-7", + "transport" + ], + "time": "2023-01-11T13:46:07+00:00" + }, + { + "name": "elasticsearch/elasticsearch", + "version": "v8.6.1", + "source": { + "type": "git", + "url": "git@github.com:elastic/elasticsearch-php.git", + "reference": "b3af4309bc73fa3b2a1e19f04f9f201916c11417" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/elastic/elasticsearch-php/zipball/b3af4309bc73fa3b2a1e19f04f9f201916c11417", + "reference": "b3af4309bc73fa3b2a1e19f04f9f201916c11417", + "shasum": "" + }, + "require": { + "elastic/transport": "^8.5", + "guzzlehttp/guzzle": "^7.0", + "php": "^7.4 || ^8.0", + "psr/http-client": "^1.0", + "psr/http-message": "^1.0", + "psr/log": "^1|^2|^3" + }, + "require-dev": { + "ext-yaml": "*", + "ext-zip": "*", + "mockery/mockery": "^1.5", + "nyholm/psr7": "^1.5", + "php-http/mock-client": "^1.5", + "phpstan/phpstan": "^1.4", + "phpunit/phpunit": "^9.5", + "symfony/finder": "~4.0", + "symfony/http-client": "^5.0|^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Elastic\\Elasticsearch\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHP Client for Elasticsearch", + "keywords": [ + "client", + "elastic", + "elasticsearch", + "search" + ], + "time": "2023-01-19T09:15:22+00:00" }, { "name": "friendsofphp/proxy-manager-lts", @@ -1440,7 +1543,338 @@ "type": "tidelift" } ], - "time": "2024-03-20T12:50:41+00:00" + "time": "2022-05-05T09:31:05+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "7.5.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "b50a2a1251152e43f6a37f0fa053e730a67d25ba" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/b50a2a1251152e43f6a37f0fa053e730a67d25ba", + "reference": "b50a2a1251152e43f6a37f0fa053e730a67d25ba", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^1.5", + "guzzlehttp/psr7": "^1.9 || ^2.4", + "php": "^7.2.5 || ^8.0", + "psr/http-client": "^1.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "provide": { + "psr/http-client-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.1", + "ext-curl": "*", + "php-http/client-integration-tests": "^3.0", + "phpunit/phpunit": "^8.5.29 || ^9.5.23", + "psr/log": "^1.1 || ^2.0 || ^3.0" + }, + "suggest": { + "ext-curl": "Required for CURL handler support", + "ext-intl": "Required for Internationalized Domain Name (IDN) support", + "psr/log": "Required for using the Log middleware" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, + "branch-alias": { + "dev-master": "7.5-dev" + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Jeremy Lindblom", + "email": "jeremeamia@gmail.com", + "homepage": "https://github.com/jeremeamia" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "MĂ¡rk SĂ¡gi-KazĂ¡r", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "psr-18", + "psr-7", + "rest", + "web service" + ], + "support": { + "issues": "https://github.com/guzzle/guzzle/issues", + "source": "https://github.com/guzzle/guzzle/tree/7.5.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", + "type": "tidelift" + } + ], + "time": "2022-08-28T15:39:27+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "1.5.2", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "b94b2807d85443f9719887892882d0329d1e2598" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/b94b2807d85443f9719887892882d0329d1e2598", + "reference": "b94b2807d85443f9719887892882d0329d1e2598", + "shasum": "" + }, + "require": { + "php": ">=5.5" + }, + "require-dev": { + "symfony/phpunit-bridge": "^4.4 || ^5.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.5-dev" + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "support": { + "issues": "https://github.com/guzzle/promises/issues", + "source": "https://github.com/guzzle/promises/tree/1.5.2" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", + "type": "tidelift" + } + ], + "time": "2022-08-28T14:55:35+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "2.4.3", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "67c26b443f348a51926030c83481b85718457d3d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/67c26b443f348a51926030c83481b85718457d3d", + "reference": "67c26b443f348a51926030c83481b85718457d3d", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0", + "ralouphie/getallheaders": "^3.0" + }, + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.1", + "http-interop/http-factory-tests": "^0.9", + "phpunit/phpunit": "^8.5.29 || ^9.5.23" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, + "branch-alias": { + "dev-master": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "MĂ¡rk SĂ¡gi-KazĂ¡r", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + }, + { + "name": "MĂ¡rk SĂ¡gi-KazĂ¡r", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "support": { + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/2.4.3" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", + "type": "tidelift" + } + ], + "time": "2022-10-26T14:07:24+00:00" }, { "name": "laminas/laminas-code", @@ -1503,73 +1937,275 @@ "type": "community_bridge" } ], - "time": "2023-10-18T10:00:55+00:00" + "time": "2023-10-18T10:00:55+00:00" + }, + { + "name": "monolog/monolog", + "version": "3.6.0", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "4b18b21a5527a3d5ffdac2fd35d3ab25a9597654" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/4b18b21a5527a3d5ffdac2fd35d3ab25a9597654", + "reference": "4b18b21a5527a3d5ffdac2fd35d3ab25a9597654", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/log": "^2.0 || ^3.0" + }, + "provide": { + "psr/log-implementation": "3.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^3.0", + "doctrine/couchdb": "~1.0@dev", + "elasticsearch/elasticsearch": "^7 || ^8", + "ext-json": "*", + "graylog2/gelf-php": "^1.4.2 || ^2.0", + "guzzlehttp/guzzle": "^7.4.5", + "guzzlehttp/psr7": "^2.2", + "mongodb/mongodb": "^1.8", + "php-amqplib/php-amqplib": "~2.4 || ^3", + "phpstan/phpstan": "^1.9", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-strict-rules": "^1.4", + "phpunit/phpunit": "^10.5.17", + "predis/predis": "^1.1 || ^2", + "ruflin/elastica": "^7", + "symfony/mailer": "^5.4 || ^6", + "symfony/mime": "^5.4 || ^6" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", + "ext-mbstring": "Allow to work properly with unicode symbols", + "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", + "ext-openssl": "Required to send log messages using SSL", + "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "https://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "support": { + "issues": "https://github.com/Seldaek/monolog/issues", + "source": "https://github.com/Seldaek/monolog/tree/3.6.0" + }, + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", + "type": "tidelift" + } + ], + "time": "2022-07-24T12:00:55+00:00" + }, + { + "name": "php-http/discovery", + "version": "1.15.2", + "source": { + "type": "git", + "url": "https://github.com/php-http/discovery.git", + "reference": "5cc428320191ac1d0b6520034c2dc0698628ced5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/discovery/zipball/5cc428320191ac1d0b6520034c2dc0698628ced5", + "reference": "5cc428320191ac1d0b6520034c2dc0698628ced5", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0|^2.0", + "php": "^7.1 || ^8.0" + }, + "conflict": { + "nyholm/psr7": "<1.0" + }, + "provide": { + "php-http/async-client-implementation": "*", + "php-http/client-implementation": "*", + "psr/http-client-implementation": "*", + "psr/http-factory-implementation": "*", + "psr/http-message-implementation": "*" + }, + "require-dev": { + "composer/composer": "^1.0.2|^2.0", + "graham-campbell/phpspec-skip-example-extension": "^5.0", + "php-http/httplug": "^1.0 || ^2.0", + "php-http/message-factory": "^1.0", + "phpspec/phpspec": "^5.1 || ^6.1 || ^7.3", + "symfony/phpunit-bridge": "^6.2" + }, + "type": "composer-plugin", + "extra": { + "class": "Http\\Discovery\\Composer\\Plugin", + "plugin-optional": true + }, + "autoload": { + "psr-4": { + "Http\\Discovery\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "MĂ¡rk SĂ¡gi-KazĂ¡r", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "Finds and installs PSR-7, PSR-17, PSR-18 and HTTPlug implementations", + "homepage": "http://php-http.org", + "keywords": [ + "adapter", + "client", + "discovery", + "factory", + "http", + "message", + "psr17", + "psr7" + ], + "support": { + "issues": "https://github.com/php-http/discovery/issues", + "source": "https://github.com/php-http/discovery/tree/1.15.2" + }, + "time": "2023-02-11T08:28:41+00:00" + }, + { + "name": "php-http/httplug", + "version": "2.3.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/httplug.git", + "reference": "f640739f80dfa1152533976e3c112477f69274eb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/httplug/zipball/f640739f80dfa1152533976e3c112477f69274eb", + "reference": "f640739f80dfa1152533976e3c112477f69274eb", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0", + "php-http/promise": "^1.1", + "psr/http-client": "^1.0", + "psr/http-message": "^1.0" + }, + "require-dev": { + "friends-of-phpspec/phpspec-code-coverage": "^4.1", + "phpspec/phpspec": "^5.1 || ^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eric GELOEN", + "email": "geloen.eric@gmail.com" + }, + { + "name": "MĂ¡rk SĂ¡gi-KazĂ¡r", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" + } + ], + "description": "HTTPlug, the HTTP client abstraction for PHP", + "homepage": "http://httplug.io", + "keywords": [ + "client", + "http" + ], + "support": { + "issues": "https://github.com/php-http/httplug/issues", + "source": "https://github.com/php-http/httplug/tree/2.3.0" + }, + "time": "2022-02-21T09:52:22+00:00" }, { - "name": "monolog/monolog", - "version": "3.6.0", + "name": "php-http/promise", + "version": "1.1.0", "source": { "type": "git", - "url": "https://github.com/Seldaek/monolog.git", - "reference": "4b18b21a5527a3d5ffdac2fd35d3ab25a9597654" + "url": "https://github.com/php-http/promise.git", + "reference": "4c4c1f9b7289a2ec57cde7f1e9762a5789506f88" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/4b18b21a5527a3d5ffdac2fd35d3ab25a9597654", - "reference": "4b18b21a5527a3d5ffdac2fd35d3ab25a9597654", + "url": "https://api.github.com/repos/php-http/promise/zipball/4c4c1f9b7289a2ec57cde7f1e9762a5789506f88", + "reference": "4c4c1f9b7289a2ec57cde7f1e9762a5789506f88", "shasum": "" }, "require": { - "php": ">=8.1", - "psr/log": "^2.0 || ^3.0" - }, - "provide": { - "psr/log-implementation": "3.0.0" + "php": "^7.1 || ^8.0" }, "require-dev": { - "aws/aws-sdk-php": "^3.0", - "doctrine/couchdb": "~1.0@dev", - "elasticsearch/elasticsearch": "^7 || ^8", - "ext-json": "*", - "graylog2/gelf-php": "^1.4.2 || ^2.0", - "guzzlehttp/guzzle": "^7.4.5", - "guzzlehttp/psr7": "^2.2", - "mongodb/mongodb": "^1.8", - "php-amqplib/php-amqplib": "~2.4 || ^3", - "phpstan/phpstan": "^1.9", - "phpstan/phpstan-deprecation-rules": "^1.0", - "phpstan/phpstan-strict-rules": "^1.4", - "phpunit/phpunit": "^10.5.17", - "predis/predis": "^1.1 || ^2", - "ruflin/elastica": "^7", - "symfony/mailer": "^5.4 || ^6", - "symfony/mime": "^5.4 || ^6" - }, - "suggest": { - "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", - "doctrine/couchdb": "Allow sending log messages to a CouchDB server", - "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", - "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", - "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", - "ext-mbstring": "Allow to work properly with unicode symbols", - "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", - "ext-openssl": "Required to send log messages using SSL", - "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)", - "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", - "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", - "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", - "rollbar/rollbar": "Allow sending log messages to Rollbar", - "ruflin/elastica": "Allow sending log messages to an Elastic Search server" + "friends-of-phpspec/phpspec-code-coverage": "^4.3.2", + "phpspec/phpspec": "^5.1.2 || ^6.2" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.x-dev" + "dev-master": "1.1-dev" } }, "autoload": { "psr-4": { - "Monolog\\": "src/Monolog" + "Http\\Promise\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -1578,33 +2214,24 @@ ], "authors": [ { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "https://seld.be" + "name": "Joel Wurtz", + "email": "joel.wurtz@gmail.com" + }, + { + "name": "MĂ¡rk SĂ¡gi-KazĂ¡r", + "email": "mark.sagikazar@gmail.com" } ], - "description": "Sends your logs to files, sockets, inboxes, databases and various web services", - "homepage": "https://github.com/Seldaek/monolog", + "description": "Promise used for asynchronous HTTP requests", + "homepage": "http://httplug.io", "keywords": [ - "log", - "logging", - "psr-3" + "promise" ], "support": { - "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/3.6.0" + "issues": "https://github.com/php-http/promise/issues", + "source": "https://github.com/php-http/promise/tree/1.1.0" }, - "funding": [ - { - "url": "https://github.com/Seldaek", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", - "type": "tidelift" - } - ], - "time": "2024-04-12T21:02:21+00:00" + "time": "2020-07-07T09:29:14+00:00" }, { "name": "phpdocumentor/reflection-common", @@ -2028,6 +2655,166 @@ }, "time": "2019-01-08T18:20:26+00:00" }, + { + "name": "psr/http-client", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", + "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP clients", + "homepage": "https://github.com/php-fig/http-client", + "keywords": [ + "http", + "http-client", + "psr", + "psr-18" + ], + "support": { + "source": "https://github.com/php-fig/http-client/tree/master" + }, + "time": "2020-06-29T06:28:15+00:00" + }, + { + "name": "psr/http-factory", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/12ac7fcd07e5b077433f5f2bee95b3a771bf61be", + "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be", + "shasum": "" + }, + "require": { + "php": ">=7.0.0", + "psr/http-message": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-factory/tree/master" + }, + "time": "2019-04-30T12:38:16+00:00" + }, + { + "name": "psr/http-message", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/master" + }, + "time": "2016-08-06T14:39:51+00:00" + }, { "name": "psr/link", "version": "2.0.1", @@ -2134,6 +2921,128 @@ }, "time": "2021-07-14T16:46:02+00:00" }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, + "time": "2019-03-08T08:55:37+00:00" + }, + { + "name": "sensio/framework-extra-bundle", + "version": "v6.2.8", + "source": { + "type": "git", + "url": "https://github.com/sensiolabs/SensioFrameworkExtraBundle.git", + "reference": "bb962f8aed09e60b0942545f6e4842ffeee4aafd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sensiolabs/SensioFrameworkExtraBundle/zipball/bb962f8aed09e60b0942545f6e4842ffeee4aafd", + "reference": "bb962f8aed09e60b0942545f6e4842ffeee4aafd", + "shasum": "" + }, + "require": { + "doctrine/annotations": "^1.0", + "php": ">=7.2.5", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/framework-bundle": "^4.4|^5.0|^6.0", + "symfony/http-kernel": "^4.4|^5.0|^6.0" + }, + "conflict": { + "doctrine/doctrine-cache-bundle": "<1.3.1", + "doctrine/persistence": "<1.3" + }, + "require-dev": { + "doctrine/dbal": "^2.10|^3.0", + "doctrine/doctrine-bundle": "^1.11|^2.0", + "doctrine/orm": "^2.5", + "symfony/browser-kit": "^4.4|^5.0|^6.0", + "symfony/doctrine-bridge": "^4.4|^5.0|^6.0", + "symfony/dom-crawler": "^4.4|^5.0|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/finder": "^4.4|^5.0|^6.0", + "symfony/monolog-bridge": "^4.0|^5.0|^6.0", + "symfony/monolog-bundle": "^3.2", + "symfony/phpunit-bridge": "^4.4.9|^5.0.9|^6.0", + "symfony/security-bundle": "^4.4|^5.0|^6.0", + "symfony/twig-bundle": "^4.4|^5.0|^6.0", + "symfony/yaml": "^4.4|^5.0|^6.0", + "twig/twig": "^1.34|^2.4|^3.0" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "6.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Sensio\\Bundle\\FrameworkExtraBundle\\": "src/" + }, + "exclude-from-classmap": [ + "/tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "This bundle provides a way to configure your controllers with annotations", + "keywords": [ + "annotations", + "controllers" + ], + "support": { + "issues": "https://github.com/sensiolabs/SensioFrameworkExtraBundle/issues", + "source": "https://github.com/sensiolabs/SensioFrameworkExtraBundle/tree/v6.2.8" + }, + "time": "2022-09-05T16:44:56+00:00" + }, { "name": "symfony/asset", "version": "v7.0.3", diff --git a/config/doctrine/orm/Park.orm.xml b/config/doctrine/orm/Park.orm.xml index f7eb600..390f843 100644 --- a/config/doctrine/orm/Park.orm.xml +++ b/config/doctrine/orm/Park.orm.xml @@ -17,6 +17,7 @@ field="dinosaurs" target-entity="App\Entity\Dinosaur" mapped-by="park" /> + - \ No newline at end of file + diff --git a/config/packages/messenger.yaml b/config/packages/messenger.yaml index c02fdca..66e6802 100644 --- a/config/packages/messenger.yaml +++ b/config/packages/messenger.yaml @@ -5,7 +5,12 @@ framework: command_bus: middleware: - doctrine_transaction + - dispatch_after_current_bus - App\Middleware\LockMiddleware + event_bus: + default_middleware: allow_no_handlers + middleware: + - doctrine_transaction failure_transport: failed transports: async_high_priority: @@ -23,3 +28,4 @@ framework: routing: 'App\Message\Food\Consume': async_low_priority 'App\Message\Food\Refill': async_high_priority + 'App\Event\Event': async_low_priority diff --git a/config/services.yaml b/config/services.yaml index cf683d4..9a20d90 100644 --- a/config/services.yaml +++ b/config/services.yaml @@ -27,5 +27,13 @@ services: App\Bus\CommandBus: $messageBus: '@command_bus' + Elastic\Elasticsearch\Client: + class: Elastic\Elasticsearch\Client + factory: ['Elastic\Elasticsearch\ClientBuilder', 'fromConfig'] + arguments: + - + hosts: + - 'elasticsearch:9200' + # add more service definitions when explicit configuration is needed # please note that last definitions always *replace* previous ones diff --git a/docker-compose.yml b/docker-compose.yml index 6f9f8ba..880d047 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -42,5 +42,16 @@ services: - db-data:/var/lib/mysql:rw restart: unless-stopped + elasticsearch: + image: docker.elastic.co/elasticsearch/elasticsearch:7.16.3 + volumes: + - 'elasticsearch:/usr/share/elasticsearch/data' + ports: + - 9200:9200 + environment: + - discovery.type=single-node + - "ES_JAVA_OPTS=-Xms512m -Xmx512m" + volumes: - db-data: ~ + db-data: ~ + elasticsearch: ~ diff --git a/src/Bus/CommandBus.php b/src/Bus/CommandBus.php index 869ddb1..e002dc5 100644 --- a/src/Bus/CommandBus.php +++ b/src/Bus/CommandBus.php @@ -16,7 +16,7 @@ public function __construct( ) { } - public function dispatch(object $input): object + public function dispatch(object $input): ?object { return $this->handle($input); } diff --git a/src/Event/AbstractEvent.php b/src/Event/AbstractEvent.php new file mode 100644 index 0000000..4408c2e --- /dev/null +++ b/src/Event/AbstractEvent.php @@ -0,0 +1,18 @@ +id; + } +} diff --git a/src/Event/Dinosaur/HasBeenCreated.php b/src/Event/Dinosaur/HasBeenCreated.php new file mode 100644 index 0000000..08ee4ba --- /dev/null +++ b/src/Event/Dinosaur/HasBeenCreated.php @@ -0,0 +1,11 @@ +indexer->delete($event->getAggregateRootId()); + } +} diff --git a/src/EventHandler/Dinosaur/UpsertDinosaurSummary.php b/src/EventHandler/Dinosaur/UpsertDinosaurSummary.php new file mode 100644 index 0000000..d161064 --- /dev/null +++ b/src/EventHandler/Dinosaur/UpsertDinosaurSummary.php @@ -0,0 +1,90 @@ +updateSummaryByDinosaur($event->getAggregateRootId()); + } + + #[AsMessageHandler] + public function handleDinosaurHasBeenUpdated(DinosaurHasBeenUpdated $event): void + { + $this->updateSummaryByDinosaur($event->getAggregateRootId()); + } + + #[AsMessageHandler] + public function handleFoodHasBeenConsumed(HasBeenConsumed $event): void + { + $this->updateSummariesByPark($event->getAggregateRootId()); + } + + #[AsMessageHandler] + public function handleFoodHasBeenRefilled(HasBeenRefilled $event): void + { + $this->updateSummariesByPark($event->getAggregateRootId()); + } + + #[AsMessageHandler] + public function handleSpeciesHasBeenUpdated(SpeciesHasBeenUpdated $event): void + { + $speciesId = $event->getAggregateRootId(); + + $species = $this ->speciesRepository->find($speciesId); + + if (null === $species) { + throw new \RuntimeException(sprintf( + 'Species with id "%s" not found', + $speciesId + )); + } + + $dinosaurs = $this->dinosaurRepository->findBySpecies($species); + + foreach ($dinosaurs as $dinosaur) { + $this->indexer->indexFromDinosaur($dinosaur); + } + } + + private function updateSummaryByDinosaur(int $dinosaurId): void + { + $dinosaur = $this->dinosaurRepository->find($dinosaurId); + + if (null === $dinosaur) { + throw new \RuntimeException(sprintf('Dinosaur with id "%s" not found', $dinosaurId)); + } + + $this->indexer->indexFromDinosaur($dinosaur); + } + + private function updateSummariesByPark(int $parkId): void + { + $dinosaurs = $this->dinosaurRepository->findByPark($parkId); + + foreach ($dinosaurs as $dinosaur) { + $this->indexer->indexFromDinosaur($dinosaur); + } + } +} diff --git a/src/Form/Type/DinosaurType.php b/src/Form/Type/DinosaurType.php index 73c0851..4496370 100644 --- a/src/Form/Type/DinosaurType.php +++ b/src/Form/Type/DinosaurType.php @@ -8,6 +8,7 @@ use Symfony\Bridge\Doctrine\Form\Type\EntityType; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\Extension\Core\Type\ColorType; +use Symfony\Component\Form\Extension\Core\Type\HiddenType; use Symfony\Component\Form\Extension\Core\Type\NumberType; use Symfony\Component\Form\Extension\Core\Type\SubmitType; use Symfony\Component\Form\Extension\Core\Type\TextType; diff --git a/src/Indexer.php b/src/Indexer.php new file mode 100644 index 0000000..80be302 --- /dev/null +++ b/src/Indexer.php @@ -0,0 +1,48 @@ +getSpecies(); + $park = $dinosaur->getPark(); + + $this->client->index([ + 'index' => self::INDEX_NAME, + 'type' => '_doc', + 'id' => $dinosaur->getId(), + 'body' => [ + 'name' => $dinosaur->getName(), + 'age' => $dinosaur->getAge(), + 'park_food_amount' => $park->getFoodAmount(), + 'park_name' => $park->getName(), + 'species_name' => $species->getName(), + 'habitats' => $species->getHabitats(), + 'feeding'=> $species->getFeeding(), + ], + ]); + } + + public function delete(int $id) + { + $this->client->delete([ + 'index' => self::INDEX_NAME, + 'type' => '_doc', + 'id' => $id, + ]); + } +} diff --git a/src/MessageHandler/Dinosaur/Create.php b/src/MessageHandler/Dinosaur/Create.php index 1d73447..209a671 100644 --- a/src/MessageHandler/Dinosaur/Create.php +++ b/src/MessageHandler/Dinosaur/Create.php @@ -3,32 +3,36 @@ namespace App\MessageHandler\Dinosaur; use App\Entity\Dinosaur; -use App\Entity\Park; -use App\Entity\Species; +use App\Event\Dinosaur\HasBeenCreated; use App\Message\Dinosaur\Create as CreateMessage; use App\MessageResults\Dinosaur\Create as CreateMessageResult; -use Doctrine\ORM\EntityManagerInterface; +use App\Repository\DinosaurRepository; +use App\Repository\ParkRepository; +use App\Repository\SpeciesRepository; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; use Symfony\Component\Messenger\Attribute\AsMessageHandler; +use Symfony\Component\Messenger\Envelope; +use Symfony\Component\Messenger\MessageBusInterface; +use Symfony\Component\Messenger\Stamp\DispatchAfterCurrentBusStamp; #[AsMessageHandler] final class Create { public function __construct( - private EntityManagerInterface $entityManager + private DinosaurRepository $dinosaurRepository, + private SpeciesRepository $speciesRepository, + private ParkRepository $parkRepository, + private MessageBusInterface $eventBus ) { } public function __invoke(CreateMessage $message) { - $speciesRepository = $this->entityManager->getRepository(Species::class); - $parkRepository = $this->entityManager->getRepository(Park::class); - - if (!$species = $speciesRepository->find($message->speciesId)) { + if (!$species = $this->speciesRepository->find($message->speciesId)) { throw new NotFoundHttpException("Species with id {$message->speciesId} not found"); } - if (!$park = $parkRepository->find($message->parkId)) { + if (!$park = $this->parkRepository->find($message->parkId)) { throw new NotFoundHttpException("Park with id {$message->parkId} not found"); } @@ -41,9 +45,17 @@ public function __invoke(CreateMessage $message) park: $park ); - $this->entityManager->persist($dino); - $this->entityManager->flush(); + $this->dinosaurRepository->add($dino); + + $id = $this->dinosaurRepository->findNextId(); + + $envelop = new Envelope(new HasBeenCreated($id)); + + $this + ->eventBus + ->dispatch($envelop->with(new DispatchAfterCurrentBusStamp())) + ; - return new CreateMessageResult($dino->getId()); + return new CreateMessageResult($id); } } diff --git a/src/MessageHandler/Dinosaur/Delete.php b/src/MessageHandler/Dinosaur/Delete.php index d130fb2..6e7495c 100644 --- a/src/MessageHandler/Dinosaur/Delete.php +++ b/src/MessageHandler/Dinosaur/Delete.php @@ -3,28 +3,41 @@ namespace App\MessageHandler\Dinosaur; use App\Entity\Dinosaur; +use App\Event\Dinosaur\HasBeenDeleted; use App\Message\Dinosaur\Delete as DeleteMessage; +use App\Repository\DinosaurRepository; use Doctrine\ORM\EntityManagerInterface; +use RuntimeException; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; use Symfony\Component\Messenger\Attribute\AsMessageHandler; +use Symfony\Component\Messenger\Envelope; +use Symfony\Component\Messenger\MessageBusInterface; +use Symfony\Component\Messenger\Stamp\DispatchAfterCurrentBusStamp; #[AsMessageHandler] final class Delete { public function __construct( - private EntityManagerInterface $entityManager + private EntityManagerInterface $entityManager, + private MessageBusInterface $eventBus, + private DinosaurRepository $dinosaurRepository ) { } public function __invoke(DeleteMessage $message) { - $dinoRepository = $this->entityManager->getRepository(Dinosaur::class); - - if (!$dinosaur = $dinoRepository->find($message->id)) { + if (!$dinosaur = $this->dinosaurRepository->find($message->id)) { throw new NotFoundHttpException("Dinosaur with id {$message->id} not found"); } $this->entityManager->remove($dinosaur); - $this->entityManager->flush(); + + $envelop = new Envelope( + new HasBeenDeleted($message->id) + ); + + $this->eventBus->dispatch( + $envelop->with(new DispatchAfterCurrentBusStamp()) + ); } } diff --git a/src/MessageHandler/Dinosaur/Edit.php b/src/MessageHandler/Dinosaur/Edit.php index 83899e6..fba67d5 100644 --- a/src/MessageHandler/Dinosaur/Edit.php +++ b/src/MessageHandler/Dinosaur/Edit.php @@ -4,16 +4,21 @@ use App\Entity\Dinosaur; use App\Entity\Species; +use App\Event\Dinosaur\HasBeenUpdated; use App\Message\Dinosaur\Edit as EditMessage; use App\MessageResults\Dinosaur\Edit as EditOutput; use Doctrine\ORM\EntityManagerInterface; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; use Symfony\Component\Messenger\Attribute\AsMessageHandler; +use Symfony\Component\Messenger\Envelope; +use Symfony\Component\Messenger\MessageBusInterface; +use Symfony\Component\Messenger\Stamp\DispatchAfterCurrentBusStamp; #[AsMessageHandler] final class Edit { public function __construct( + private MessageBusInterface $eventBus, private EntityManagerInterface $entityManager ) { } @@ -36,6 +41,11 @@ public function __invoke(EditMessage $message) $dinosaur->setAge($message->age); $dinosaur->setSpecies($species); - $this->entityManager->flush(); + $envelop = new Envelope(new HasBeenUpdated($dinosaur->getId())); + + $this + ->eventBus + ->dispatch($envelop->with(new DispatchAfterCurrentBusStamp())) + ; } } diff --git a/src/MessageHandler/Food/Consume.php b/src/MessageHandler/Food/Consume.php index 05c6617..ee83770 100644 --- a/src/MessageHandler/Food/Consume.php +++ b/src/MessageHandler/Food/Consume.php @@ -5,17 +5,22 @@ namespace App\MessageHandler\Food; use App\Entity\Dinosaur; +use App\Event\Food\HasBeenConsumed; use App\Message\Food\Consume as FoodConsume; use Doctrine\ORM\EntityManagerInterface; use DomainException; use Psr\Log\LoggerInterface; use Symfony\Component\Messenger\Attribute\AsMessageHandler; +use Symfony\Component\Messenger\Envelope; +use Symfony\Component\Messenger\MessageBusInterface; +use Symfony\Component\Messenger\Stamp\DispatchAfterCurrentBusStamp; #[AsMessageHandler] class Consume { public function __construct( private EntityManagerInterface $em, + private MessageBusInterface $eventBus, private LoggerInterface $logger ) { } @@ -49,6 +54,11 @@ public function __invoke(FoodConsume $message) $park->setFoodAmount($park->getFoodAmount() - $consumedAmout); - $this->em->flush(); + $envelop = new Envelope(new HasBeenConsumed($park->getId())); + + $this + ->eventBus + ->dispatch($envelop->with(new DispatchAfterCurrentBusStamp())) + ; } } diff --git a/src/MessageHandler/Food/Refill.php b/src/MessageHandler/Food/Refill.php index 60cd8ff..952c546 100644 --- a/src/MessageHandler/Food/Refill.php +++ b/src/MessageHandler/Food/Refill.php @@ -5,18 +5,23 @@ namespace App\MessageHandler\Food; use App\Entity\Park; +use App\Event\AbstractEvent\HasBeenRefilled; use App\Message\Food\Refill as FoodRefill; use Doctrine\ORM\EntityManagerInterface; use DomainException; use Psr\Log\LoggerInterface; use Symfony\Component\Messenger\Attribute\AsMessageHandler; +use Symfony\Component\Messenger\Envelope; +use Symfony\Component\Messenger\MessageBusInterface; +use Symfony\Component\Messenger\Stamp\DispatchAfterCurrentBusStamp; #[AsMessageHandler] class Refill { public function __construct( private LoggerInterface $logger, - private EntityManagerInterface $entityManager + private EntityManagerInterface $entityManager, + private MessageBusInterface $eventBus ) { } @@ -38,6 +43,11 @@ public function __invoke(FoodRefill $refill) $park->setFoodAmount(100); } - $this->entityManager->flush(); + $envelop = new Envelope(new HasBeenRefilled($park->getId())); + + $this + ->eventBus + ->dispatch($envelop->with(new DispatchAfterCurrentBusStamp())) + ; } } diff --git a/src/MessageHandler/Species/Create.php b/src/MessageHandler/Species/Create.php index 7f4ceb0..a4f7db1 100644 --- a/src/MessageHandler/Species/Create.php +++ b/src/MessageHandler/Species/Create.php @@ -3,16 +3,22 @@ namespace App\MessageHandler\Species; use App\Entity\Species; +use App\Event\Species\HasBeenCreated; use App\Message\Species\Create as CreateMessage; use App\MessageResults\Species\Create as CreateMessageResult; +use App\Repository\SpeciesRepository; use Doctrine\ORM\EntityManagerInterface; use Symfony\Component\Messenger\Attribute\AsMessageHandler; +use Symfony\Component\Messenger\Envelope; +use Symfony\Component\Messenger\MessageBusInterface; +use Symfony\Component\Messenger\Stamp\DispatchAfterCurrentBusStamp; #[AsMessageHandler] final class Create { public function __construct( - private EntityManagerInterface $entityManager + private SpeciesRepository $speciesRepository, + private MessageBusInterface $eventBus ) { } @@ -24,9 +30,17 @@ public function __invoke(CreateMessage $message): CreateMessageResult feeding: $message->feeding ); - $this->entityManager->persist($species); - $this->entityManager->flush(); + $this->speciesRepository->persist($species); - return new CreateMessageResult($species->getId()); + $id = $this->speciesRepository->findNextId(); + + $envelop = new Envelope(new HasBeenCreated($id)); + + $this + ->eventBus + ->dispatch($envelop->with(new DispatchAfterCurrentBusStamp())) + ; + + return new CreateMessageResult($id); } } diff --git a/src/MessageHandler/Species/Delete.php b/src/MessageHandler/Species/Delete.php index 2f71dbd..54b24ba 100644 --- a/src/MessageHandler/Species/Delete.php +++ b/src/MessageHandler/Species/Delete.php @@ -1,9 +1,10 @@ entityManager->getRepository(Species::class); - - if (!$species = $speciesRepository->find($message->id)) { + if (!$species = $this->speciesRepository->find($message->id)) { throw new NotFoundHttpException("Species with id {$message->id} not found"); } $this->entityManager->remove($species); - $this->entityManager->flush(); } } diff --git a/src/MessageHandler/Species/Edit.php b/src/MessageHandler/Species/Edit.php index 4f6a333..a138739 100644 --- a/src/MessageHandler/Species/Edit.php +++ b/src/MessageHandler/Species/Edit.php @@ -1,26 +1,30 @@ entityManager->getRepository(Species::class); - - if (!$species = $speciesRepository->find($message->id)) { + if (!$species = $this->speciesRepository->find($message->id)) { throw new NotFoundHttpException("Species with id {$message->id} not found"); } @@ -28,6 +32,11 @@ public function __invoke(EditMessage $message): void $species->setFeeding($message->feeding); $species->setHabitats($message->habitats); - $this->entityManager->flush(); + $envelop = new Envelope(new HasBeenUpdated($message->id)); + + $this + ->eventBus + ->dispatch($envelop->with(new DispatchAfterCurrentBusStamp())) + ; } } diff --git a/src/Repository/DinosaurRepository.php b/src/Repository/DinosaurRepository.php index 1016b70..b60f6c2 100644 --- a/src/Repository/DinosaurRepository.php +++ b/src/Repository/DinosaurRepository.php @@ -13,6 +13,11 @@ public function __construct(ManagerRegistry $registry) parent::__construct($registry, Dinosaur::class); } + public function add(Dinosaur $dinosaur): void + { + $this->getEntityManager()->persist($dinosaur); + } + public function search(?string $q): array { if (null === $q) { diff --git a/src/Repository/ParkRepository.php b/src/Repository/ParkRepository.php new file mode 100644 index 0000000..ffd960b --- /dev/null +++ b/src/Repository/ParkRepository.php @@ -0,0 +1,15 @@ +getEntityManager()->persist($species); + } } diff --git a/src/Stamp/LockStamp.php b/src/Stamp/LockStamp.php index 7a14098..587381d 100644 --- a/src/Stamp/LockStamp.php +++ b/src/Stamp/LockStamp.php @@ -1,7 +1,5 @@ Date: Fri, 17 Feb 2023 10:24:29 +0100 Subject: [PATCH 09/10] refactor: move integer id to uuid --- composer.json | 1 + composer.lock | 123 ++++++++++++++---- config/doctrine/orm/Dinosaur.orm.xml | 4 +- config/doctrine/orm/Species.orm.xml | 4 +- config/packages/messenger.yaml | 2 +- migrations/Version20230217084031.php | 37 ++++++ src/Command/ConsumeCommand.php | 5 +- src/Controller/DinosaursController.php | 12 +- src/Controller/SpeciesController.php | 8 +- src/Entity/Dinosaur.php | 13 +- src/Entity/Species.php | 15 ++- src/Event/AbstractEvent.php | 6 +- src/Event/AsyncLowPriorityEvent.php | 9 ++ src/Event/Dinosaur/HasBeenCreated.php | 3 +- src/Event/Dinosaur/HasBeenDeleted.php | 3 +- src/Event/Dinosaur/HasBeenUpdated.php | 3 +- src/Event/Event.php | 10 -- src/Event/Food/HasBeenConsumed.php | 3 +- src/Event/Food/HasBeenRefilled.php | 3 +- src/Event/Species/HasBeenCreated.php | 3 +- src/Event/Species/HasBeenDeleted.php | 3 +- src/Event/Species/HasBeenUpdated.php | 3 +- .../Dinosaur/DeleteDinosaurSummary.php | 2 +- .../Dinosaur/UpsertDinosaurSummary.php | 12 +- src/EventListener/WorkerListener.php | 4 + src/Form/Type/DinosaurType.php | 1 - src/Indexer.php | 2 +- src/Message/Dinosaur/Create.php | 2 +- src/Message/Dinosaur/Delete.php | 2 +- src/Message/Dinosaur/Edit.php | 4 +- src/Message/Food/Consume.php | 2 +- src/Message/Species/Delete.php | 2 +- src/Message/Species/Edit.php | 2 +- src/MessageHandler/Dinosaur/Create.php | 6 +- src/MessageHandler/Dinosaur/Edit.php | 18 +-- src/MessageHandler/Food/Consume.php | 2 +- src/MessageHandler/Food/Refill.php | 2 +- src/MessageHandler/Species/Create.php | 12 +- src/Stamp/LockStamp.php | 2 +- 39 files changed, 242 insertions(+), 108 deletions(-) create mode 100644 migrations/Version20230217084031.php create mode 100644 src/Event/AsyncLowPriorityEvent.php delete mode 100644 src/Event/Event.php diff --git a/composer.json b/composer.json index 8a99cf2..d73d79f 100644 --- a/composer.json +++ b/composer.json @@ -39,6 +39,7 @@ "symfony/string": "^7.0", "symfony/translation": "^7.0", "symfony/twig-bundle": "^7.0", + "symfony/uid": "^7.0", "symfony/validator": "^7.0", "symfony/web-link": "^7.0", "symfony/yaml": "^7.0", diff --git a/composer.lock b/composer.lock index 16d2b54..f34a2ea 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "3782904a5950ea216badb0d03761a762", + "content-hash": "1bfc4cd53ff6415f1246ad7cbdab8353", "packages": [ { "name": "composer/package-versions-deprecated", @@ -6282,28 +6282,36 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2022-05-10T07:21:04+00:00" }, { - "name": "symfony/polyfill-php83", - "version": "v1.29.0", + "name": "symfony/polyfill-uuid", + "version": "v1.27.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php83.git", - "reference": "86fcae159633351e5fd145d1c47de6c528f8caff" + "url": "https://github.com/symfony/polyfill-uuid.git", + "reference": "f3cf1a645c2734236ed1e2e671e273eeb3586166" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/86fcae159633351e5fd145d1c47de6c528f8caff", - "reference": "86fcae159633351e5fd145d1c47de6c528f8caff", + "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/f3cf1a645c2734236ed1e2e671e273eeb3586166", + "reference": "f3cf1a645c2734236ed1e2e671e273eeb3586166", "shasum": "" }, "require": { - "php": ">=7.1", - "symfony/polyfill-php80": "^1.14" + "php": ">=7.1" + }, + "provide": { + "ext-uuid": "*" + }, + "suggest": { + "ext-uuid": "For best performance" }, "type": "library", "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -6314,11 +6322,8 @@ "bootstrap.php" ], "psr-4": { - "Symfony\\Polyfill\\Php83\\": "" - }, - "classmap": [ - "Resources/stubs" - ] + "Symfony\\Polyfill\\Uuid\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -6326,24 +6331,24 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "GrĂ©goire Pineau", + "email": "lyrixx@lyrixx.info" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", + "description": "Symfony polyfill for uuid functions", "homepage": "https://symfony.com", "keywords": [ "compatibility", "polyfill", "portable", - "shim" + "uuid" ], "support": { - "source": "https://github.com/symfony/polyfill-php83/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-uuid/tree/v1.27.0" }, "funding": [ { @@ -6359,7 +6364,7 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/process", @@ -7845,7 +7850,81 @@ "type": "tidelift" } ], - "time": "2024-02-15T11:33:06+00:00" + "time": "2022-05-27T16:55:36+00:00" + }, + { + "name": "symfony/uid", + "version": "v6.1.11", + "source": { + "type": "git", + "url": "https://github.com/symfony/uid.git", + "reference": "7c53913df24517eb5e0fab4caf294e84fcecc277" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/uid/zipball/7c53913df24517eb5e0fab4caf294e84fcecc277", + "reference": "7c53913df24517eb5e0fab4caf294e84fcecc277", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/polyfill-uuid": "^1.15" + }, + "require-dev": { + "symfony/console": "^5.4|^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Uid\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "GrĂ©goire Pineau", + "email": "lyrixx@lyrixx.info" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to generate and represent UIDs", + "homepage": "https://symfony.com", + "keywords": [ + "UID", + "ulid", + "uuid" + ], + "support": { + "source": "https://github.com/symfony/uid/tree/v6.1.11" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-01-01T08:36:55+00:00" }, { "name": "symfony/validator", diff --git a/config/doctrine/orm/Dinosaur.orm.xml b/config/doctrine/orm/Dinosaur.orm.xml index e1f769d..eec174e 100644 --- a/config/doctrine/orm/Dinosaur.orm.xml +++ b/config/doctrine/orm/Dinosaur.orm.xml @@ -10,9 +10,7 @@ table="dinosaur" > - - - + diff --git a/config/doctrine/orm/Species.orm.xml b/config/doctrine/orm/Species.orm.xml index 100370d..dbaa335 100644 --- a/config/doctrine/orm/Species.orm.xml +++ b/config/doctrine/orm/Species.orm.xml @@ -10,9 +10,7 @@ table="species" > - - - + diff --git a/config/packages/messenger.yaml b/config/packages/messenger.yaml index 66e6802..697a115 100644 --- a/config/packages/messenger.yaml +++ b/config/packages/messenger.yaml @@ -28,4 +28,4 @@ framework: routing: 'App\Message\Food\Consume': async_low_priority 'App\Message\Food\Refill': async_high_priority - 'App\Event\Event': async_low_priority + 'App\Event\AsyncLowPriorityEvent': async_low_priority diff --git a/migrations/Version20230217084031.php b/migrations/Version20230217084031.php new file mode 100644 index 0000000..7e08774 --- /dev/null +++ b/migrations/Version20230217084031.php @@ -0,0 +1,37 @@ +addSql('ALTER TABLE dinosaur DROP FOREIGN KEY FK_DAEDC56EB2A1D860'); + $this->addSql('ALTER TABLE dinosaur CHANGE id id BINARY(16) NOT NULL COMMENT \'(DC2Type:uuid)\', CHANGE species_id species_id BINARY(16) DEFAULT NULL COMMENT \'(DC2Type:uuid)\''); + $this->addSql('ALTER TABLE species CHANGE id id BINARY(16) NOT NULL COMMENT \'(DC2Type:uuid)\''); + $this->addSql('ALTER TABLE dinosaur ADD CONSTRAINT FK_DAEDC56EB2A1D860 FOREIGN KEY (species_id) REFERENCES species (id)'); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql('ALTER TABLE dinosaur DROP FOREIGN KEY FK_DAEDC56EB2A1D860'); + $this->addSql('ALTER TABLE dinosaur CHANGE id id INT AUTO_INCREMENT NOT NULL, CHANGE species_id species_id INT DEFAULT NULL'); + $this->addSql('ALTER TABLE species CHANGE id id INT AUTO_INCREMENT NOT NULL'); + $this->addSql('ALTER TABLE dinosaur ADD CONSTRAINT FK_DAEDC56EB2A1D860 FOREIGN KEY (species_id) REFERENCES species (id)'); + } +} diff --git a/src/Command/ConsumeCommand.php b/src/Command/ConsumeCommand.php index 63d4a03..3c55025 100644 --- a/src/Command/ConsumeCommand.php +++ b/src/Command/ConsumeCommand.php @@ -39,7 +39,10 @@ protected function execute(InputInterface $input, OutputInterface $output) $dinosaur = $dinosaurs[$randomDinoKey]; - $consumeMessage = new Consume($dinosaur->getId(), $dinosaur->getName()); + $consumeMessage = new Consume( + $dinosaur->getId()->toRfc4122(), + $dinosaur->getName() + ); $this->bus->dispatch($consumeMessage); } diff --git a/src/Controller/DinosaursController.php b/src/Controller/DinosaursController.php index 5821fda..d4d5725 100644 --- a/src/Controller/DinosaursController.php +++ b/src/Controller/DinosaursController.php @@ -49,7 +49,7 @@ public function list(Request $request, ManagerRegistry $doctrine): Response #[Route( '/dinosaurs/{id}', name: 'app_single_dinosaur', - requirements: ['id' => '\d+'] + requirements: ['id' => '^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$'] )] public function single(string $id, ManagerRegistry $doctrine): Response { @@ -67,7 +67,7 @@ public function single(string $id, ManagerRegistry $doctrine): Response } #[Route('/dinosaurs/create', name: 'app_create_dinosaur')] - public function create(Request $request, ManagerRegistry $doctrine): Response + public function create(Request $request): Response { $form = $this->createForm(DinosaurType::class); @@ -101,9 +101,9 @@ public function create(Request $request, ManagerRegistry $doctrine): Response #[Route( '/dinosaurs/{id}/edit', name: 'app_edit_dinosaur', - requirements: ['id' => '\d+'] + requirements: ['id' => '^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$'] )] - public function edit(Request $request, int $id, ManagerRegistry $doctrine): Response + public function edit(Request $request, string $id, ManagerRegistry $doctrine): Response { $dinosaur = $doctrine ->getRepository(Dinosaur::class) @@ -142,9 +142,9 @@ public function edit(Request $request, int $id, ManagerRegistry $doctrine): Resp #[Route( '/dinosaurs/{id}/remove', name: 'app_remove_dinosaur', - requirements: ['id' => '\d+'] + requirements: ['id' => '^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$'] )] - public function remove(int $id): Response + public function remove(string $id): Response { $this->bus->dispatch(new Delete($id)); diff --git a/src/Controller/SpeciesController.php b/src/Controller/SpeciesController.php index e4f182a..0fe9960 100644 --- a/src/Controller/SpeciesController.php +++ b/src/Controller/SpeciesController.php @@ -65,9 +65,9 @@ public function create(Request $request, ManagerRegistry $doctrine): Response #[Route( '/species/{id}/edit', name: 'app_edit_species', - requirements: ['id' => '\d+'] + requirements: ['id' => '^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$'] )] - public function edit(Request $request, int $id, ManagerRegistry $doctrine): Response + public function edit(Request $request, string $id, ManagerRegistry $doctrine): Response { $species = $doctrine ->getRepository(Species::class) @@ -104,9 +104,9 @@ public function edit(Request $request, int $id, ManagerRegistry $doctrine): Resp #[Route( '/species/{id}/remove', name: 'app_remove_species', - requirements: ['id' => '\d+'] + requirements: ['id' => '^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$'] )] - public function remove(int $id): Response + public function remove(string $id): Response { $this->bus->dispatch(new Delete($id)); diff --git a/src/Entity/Dinosaur.php b/src/Entity/Dinosaur.php index b45c074..ae2045b 100644 --- a/src/Entity/Dinosaur.php +++ b/src/Entity/Dinosaur.php @@ -2,6 +2,8 @@ namespace App\Entity; +use Symfony\Component\Uid\Uuid; + class Dinosaur { private int $id; @@ -12,15 +14,22 @@ public function __construct( private Species $species, private int $age, private string $eyesColor, - private Park $park + private Park $park, + ?Uuid $id = null ) { + $this->id = $id ?? Uuid::v4(); } - public function getId(): int + public function getId(): ?Uuid { return $this->id; } + public function setId(?Uuid $id): void + { + $this->id = $id; + } + public function getName(): string { return $this->name; diff --git a/src/Entity/Species.php b/src/Entity/Species.php index 61d5a90..e49365f 100644 --- a/src/Entity/Species.php +++ b/src/Entity/Species.php @@ -4,28 +4,33 @@ use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\Collection; +use Symfony\Component\Uid\Uuid; class Species { - private int $id; + private ?Uuid $id; private Collection $dinosaurs; public function __construct( private string $name, private array $habitats, private string $feeding, + ?Uuid $id = null ) { - $this->name = $name; - $this->habitats = $habitats; - $this->feeding = $feeding; + $this->id = $id ?? Uuid::v4(); $this->dinosaurs = new ArrayCollection(); } - public function getId(): int + public function getId(): ?Uuid { return $this->id; } + public function setId(?Uuid $id): void + { + $this->id = $id; + } + public function getName(): string { return $this->name; diff --git a/src/Event/AbstractEvent.php b/src/Event/AbstractEvent.php index 4408c2e..be3b76e 100644 --- a/src/Event/AbstractEvent.php +++ b/src/Event/AbstractEvent.php @@ -4,14 +4,14 @@ namespace App\Event; -class AbstractEvent implements Event +class AbstractEvent { public function __construct( - private int $id + private string $id ) { } - public function getAggregateRootId(): int + public function getId(): string { return $this->id; } diff --git a/src/Event/AsyncLowPriorityEvent.php b/src/Event/AsyncLowPriorityEvent.php new file mode 100644 index 0000000..e9ba284 --- /dev/null +++ b/src/Event/AsyncLowPriorityEvent.php @@ -0,0 +1,9 @@ +indexer->delete($event->getAggregateRootId()); + $this->indexer->delete($event->getId()); } } diff --git a/src/EventHandler/Dinosaur/UpsertDinosaurSummary.php b/src/EventHandler/Dinosaur/UpsertDinosaurSummary.php index d161064..3500455 100644 --- a/src/EventHandler/Dinosaur/UpsertDinosaurSummary.php +++ b/src/EventHandler/Dinosaur/UpsertDinosaurSummary.php @@ -26,31 +26,31 @@ public function __construct( #[AsMessageHandler] public function handleDinosaurHasBeenCreated(DinosaurHasBeenCreated $event): void { - $this->updateSummaryByDinosaur($event->getAggregateRootId()); + $this->updateSummaryByDinosaur($event->getId()); } #[AsMessageHandler] public function handleDinosaurHasBeenUpdated(DinosaurHasBeenUpdated $event): void { - $this->updateSummaryByDinosaur($event->getAggregateRootId()); + $this->updateSummaryByDinosaur($event->getId()); } #[AsMessageHandler] public function handleFoodHasBeenConsumed(HasBeenConsumed $event): void { - $this->updateSummariesByPark($event->getAggregateRootId()); + $this->updateSummariesByPark((int) $event->getId()); } #[AsMessageHandler] public function handleFoodHasBeenRefilled(HasBeenRefilled $event): void { - $this->updateSummariesByPark($event->getAggregateRootId()); + $this->updateSummariesByPark((int) $event->getId()); } #[AsMessageHandler] public function handleSpeciesHasBeenUpdated(SpeciesHasBeenUpdated $event): void { - $speciesId = $event->getAggregateRootId(); + $speciesId = $event->getId(); $species = $this ->speciesRepository->find($speciesId); @@ -68,7 +68,7 @@ public function handleSpeciesHasBeenUpdated(SpeciesHasBeenUpdated $event): void } } - private function updateSummaryByDinosaur(int $dinosaurId): void + private function updateSummaryByDinosaur(string $dinosaurId): void { $dinosaur = $this->dinosaurRepository->find($dinosaurId); diff --git a/src/EventListener/WorkerListener.php b/src/EventListener/WorkerListener.php index 5a82e5e..088f6a9 100644 --- a/src/EventListener/WorkerListener.php +++ b/src/EventListener/WorkerListener.php @@ -59,6 +59,10 @@ public function onWorkerMessageHandledEvent(WorkerMessageHandledEvent $event) $handledStamp = $envelope->last(HandledStamp::class); + if (null === $handledStamp) { + return; + } + $handlerName = $handledStamp->getHandlerName(); $message = $envelope->getMessage(); diff --git a/src/Form/Type/DinosaurType.php b/src/Form/Type/DinosaurType.php index 4496370..73c0851 100644 --- a/src/Form/Type/DinosaurType.php +++ b/src/Form/Type/DinosaurType.php @@ -8,7 +8,6 @@ use Symfony\Bridge\Doctrine\Form\Type\EntityType; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\Extension\Core\Type\ColorType; -use Symfony\Component\Form\Extension\Core\Type\HiddenType; use Symfony\Component\Form\Extension\Core\Type\NumberType; use Symfony\Component\Form\Extension\Core\Type\SubmitType; use Symfony\Component\Form\Extension\Core\Type\TextType; diff --git a/src/Indexer.php b/src/Indexer.php index 80be302..f115818 100644 --- a/src/Indexer.php +++ b/src/Indexer.php @@ -37,7 +37,7 @@ public function indexFromDinosaur(Dinosaur $dinosaur): void ]); } - public function delete(int $id) + public function delete(string $id) { $this->client->delete([ 'index' => self::INDEX_NAME, diff --git a/src/Message/Dinosaur/Create.php b/src/Message/Dinosaur/Create.php index 5ccc485..7190c94 100644 --- a/src/Message/Dinosaur/Create.php +++ b/src/Message/Dinosaur/Create.php @@ -9,7 +9,7 @@ public function __construct( public readonly string $gender, public readonly string $eyesColor, public readonly int $age, - public readonly int $speciesId, + public readonly string $speciesId, public readonly int $parkId, ) { } diff --git a/src/Message/Dinosaur/Delete.php b/src/Message/Dinosaur/Delete.php index 4bbd29d..941dfc2 100644 --- a/src/Message/Dinosaur/Delete.php +++ b/src/Message/Dinosaur/Delete.php @@ -5,7 +5,7 @@ class Delete { public function __construct( - public readonly int $id + public readonly string $id ) { } } diff --git a/src/Message/Dinosaur/Edit.php b/src/Message/Dinosaur/Edit.php index fb6102a..88e2c9c 100644 --- a/src/Message/Dinosaur/Edit.php +++ b/src/Message/Dinosaur/Edit.php @@ -5,12 +5,12 @@ class Edit { public function __construct( - public readonly int $id, + public readonly string $id, public readonly string $name, public readonly string $gender, public readonly string $eyesColor, public readonly int $age, - public readonly int $speciesId + public readonly string $speciesId ) { } } diff --git a/src/Message/Food/Consume.php b/src/Message/Food/Consume.php index 336f2ac..8cb8dda 100644 --- a/src/Message/Food/Consume.php +++ b/src/Message/Food/Consume.php @@ -9,7 +9,7 @@ class Consume implements Lockable { public function __construct( - public readonly int $dinosaurId, + public readonly string $dinosaurId, public readonly string $dinosaurName ) { } diff --git a/src/Message/Species/Delete.php b/src/Message/Species/Delete.php index b0b40ef..578beae 100644 --- a/src/Message/Species/Delete.php +++ b/src/Message/Species/Delete.php @@ -5,7 +5,7 @@ class Delete { public function __construct( - public readonly int $id + public readonly string $id ) { } } diff --git a/src/Message/Species/Edit.php b/src/Message/Species/Edit.php index 911c931..5fb840c 100644 --- a/src/Message/Species/Edit.php +++ b/src/Message/Species/Edit.php @@ -5,7 +5,7 @@ class Edit { public function __construct( - public readonly int $id, + public readonly string $id, public readonly string $name, public readonly string $feeding, public readonly array $habitats diff --git a/src/MessageHandler/Dinosaur/Create.php b/src/MessageHandler/Dinosaur/Create.php index 209a671..fa1da30 100644 --- a/src/MessageHandler/Dinosaur/Create.php +++ b/src/MessageHandler/Dinosaur/Create.php @@ -47,15 +47,13 @@ public function __invoke(CreateMessage $message) $this->dinosaurRepository->add($dino); - $id = $this->dinosaurRepository->findNextId(); - - $envelop = new Envelope(new HasBeenCreated($id)); + $envelop = new Envelope(new HasBeenCreated($dino->getId()->toRfc4122())); $this ->eventBus ->dispatch($envelop->with(new DispatchAfterCurrentBusStamp())) ; - return new CreateMessageResult($id); + return new CreateMessageResult($dino->getId()->toRfc4122()); } } diff --git a/src/MessageHandler/Dinosaur/Edit.php b/src/MessageHandler/Dinosaur/Edit.php index fba67d5..aa2862a 100644 --- a/src/MessageHandler/Dinosaur/Edit.php +++ b/src/MessageHandler/Dinosaur/Edit.php @@ -2,12 +2,10 @@ namespace App\MessageHandler\Dinosaur; -use App\Entity\Dinosaur; -use App\Entity\Species; use App\Event\Dinosaur\HasBeenUpdated; use App\Message\Dinosaur\Edit as EditMessage; -use App\MessageResults\Dinosaur\Edit as EditOutput; -use Doctrine\ORM\EntityManagerInterface; +use App\Repository\DinosaurRepository; +use App\Repository\SpeciesRepository; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; use Symfony\Component\Messenger\Attribute\AsMessageHandler; use Symfony\Component\Messenger\Envelope; @@ -19,20 +17,18 @@ final class Edit { public function __construct( private MessageBusInterface $eventBus, - private EntityManagerInterface $entityManager + private DinosaurRepository $dinosaurRepository, + private SpeciesRepository $speciesRepository, ) { } public function __invoke(EditMessage $message) { - $dinosaurRepository = $this->entityManager->getRepository(Dinosaur::class); - $speciesRepository = $this->entityManager->getRepository(Species::class); - - if (!$dinosaur = $dinosaurRepository->find($message->id)) { + if (!$dinosaur = $this->dinosaurRepository->find($message->id)) { throw new NotFoundHttpException("Dinosaur with id {$message->id} not found"); } - if (!$species = $speciesRepository->find($message->speciesId)) { + if (!$species = $this->speciesRepository->find($message->speciesId)) { throw new NotFoundHttpException("Species with id {$message->id} not found"); } @@ -41,7 +37,7 @@ public function __invoke(EditMessage $message) $dinosaur->setAge($message->age); $dinosaur->setSpecies($species); - $envelop = new Envelope(new HasBeenUpdated($dinosaur->getId())); + $envelop = new Envelope(new HasBeenUpdated($dinosaur->getId()->toRfc4122())); $this ->eventBus diff --git a/src/MessageHandler/Food/Consume.php b/src/MessageHandler/Food/Consume.php index ee83770..39912d4 100644 --- a/src/MessageHandler/Food/Consume.php +++ b/src/MessageHandler/Food/Consume.php @@ -54,7 +54,7 @@ public function __invoke(FoodConsume $message) $park->setFoodAmount($park->getFoodAmount() - $consumedAmout); - $envelop = new Envelope(new HasBeenConsumed($park->getId())); + $envelop = new Envelope(new HasBeenConsumed((string) $park->getId())); $this ->eventBus diff --git a/src/MessageHandler/Food/Refill.php b/src/MessageHandler/Food/Refill.php index 952c546..d5772a2 100644 --- a/src/MessageHandler/Food/Refill.php +++ b/src/MessageHandler/Food/Refill.php @@ -43,7 +43,7 @@ public function __invoke(FoodRefill $refill) $park->setFoodAmount(100); } - $envelop = new Envelope(new HasBeenRefilled($park->getId())); + $envelop = new Envelope(new HasBeenRefilled((string) $park->getId())); $this ->eventBus diff --git a/src/MessageHandler/Species/Create.php b/src/MessageHandler/Species/Create.php index a4f7db1..f4a426b 100644 --- a/src/MessageHandler/Species/Create.php +++ b/src/MessageHandler/Species/Create.php @@ -7,11 +7,11 @@ use App\Message\Species\Create as CreateMessage; use App\MessageResults\Species\Create as CreateMessageResult; use App\Repository\SpeciesRepository; -use Doctrine\ORM\EntityManagerInterface; use Symfony\Component\Messenger\Attribute\AsMessageHandler; use Symfony\Component\Messenger\Envelope; use Symfony\Component\Messenger\MessageBusInterface; use Symfony\Component\Messenger\Stamp\DispatchAfterCurrentBusStamp; +use Symfony\Component\Uid\Uuid; #[AsMessageHandler] final class Create @@ -30,17 +30,17 @@ public function __invoke(CreateMessage $message): CreateMessageResult feeding: $message->feeding ); - $this->speciesRepository->persist($species); + $this->speciesRepository->add($species); - $id = $this->speciesRepository->findNextId(); - - $envelop = new Envelope(new HasBeenCreated($id)); + $envelop = new Envelope(new HasBeenCreated( + $species->getId()->toRfc4122() + )); $this ->eventBus ->dispatch($envelop->with(new DispatchAfterCurrentBusStamp())) ; - return new CreateMessageResult($id); + return new CreateMessageResult($species->getId()->toRfc4122()); } } diff --git a/src/Stamp/LockStamp.php b/src/Stamp/LockStamp.php index 587381d..26aee5e 100644 --- a/src/Stamp/LockStamp.php +++ b/src/Stamp/LockStamp.php @@ -7,7 +7,7 @@ class LockStamp implements StampInterface { public function __construct( - public readonly int $lockKey + public readonly string $lockKey ) { } } From 16836b2d6b35c9b68ed3315dc6d54d0c8a5fdbe5 Mon Sep 17 00:00:00 2001 From: BriceCorreia Date: Mon, 4 Mar 2024 13:29:30 +0100 Subject: [PATCH 10/10] refacto: remove uuid + fix fixtures --- composer.json | 1 - composer.lock | 622 +++++++----------- config/doctrine/orm/Dinosaur.orm.xml | 4 +- config/doctrine/orm/Species.orm.xml | 4 +- config/packages/http_discovery.yaml | 10 + docker-compose.yml | 22 +- migrations/Version20230217084031.php | 37 -- src/Command/ConsumeCommand.php | 15 +- src/Command/RefillCommand.php | 8 +- src/Controller/DinosaursController.php | 6 +- src/Controller/SpeciesController.php | 4 +- src/DataFixtures/AppFixtures.php | 8 +- src/Entity/Dinosaur.php | 11 +- src/Entity/Park.php | 3 +- src/Entity/Species.php | 12 +- src/Event/AbstractEvent.php | 4 +- src/Event/Food/HasBeenRefilled.php | 2 +- .../Dinosaur/UpsertDinosaurSummary.php | 10 +- src/Indexer.php | 2 +- src/Message/Dinosaur/Create.php | 2 +- src/Message/Dinosaur/Delete.php | 2 +- src/Message/Dinosaur/Edit.php | 2 +- src/Message/Food/Consume.php | 2 +- src/Message/Species/Delete.php | 2 +- src/Message/Species/Edit.php | 2 +- src/MessageHandler/Dinosaur/Create.php | 6 +- src/MessageHandler/Dinosaur/Edit.php | 2 +- src/MessageHandler/Food/Consume.php | 3 +- src/MessageHandler/Food/Refill.php | 3 +- src/MessageHandler/Species/Create.php | 10 +- src/MessageResults/Dinosaur/Create.php | 2 +- src/MessageResults/Species/Create.php | 2 +- src/Repository/DinosaurRepository.php | 5 +- src/Repository/SpeciesRepository.php | 5 +- src/Stamp/LockStamp.php | 2 +- symfony.lock | 12 + 36 files changed, 340 insertions(+), 509 deletions(-) create mode 100644 config/packages/http_discovery.yaml delete mode 100644 migrations/Version20230217084031.php diff --git a/composer.json b/composer.json index d73d79f..8a99cf2 100644 --- a/composer.json +++ b/composer.json @@ -39,7 +39,6 @@ "symfony/string": "^7.0", "symfony/translation": "^7.0", "symfony/twig-bundle": "^7.0", - "symfony/uid": "^7.0", "symfony/validator": "^7.0", "symfony/web-link": "^7.0", "symfony/yaml": "^7.0", diff --git a/composer.lock b/composer.lock index f34a2ea..2c574d8 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "1bfc4cd53ff6415f1246ad7cbdab8353", + "content-hash": "a5b6857e351b48ef5e0f02910f02413b", "packages": [ { "name": "composer/package-versions-deprecated", @@ -174,16 +174,16 @@ }, { "name": "doctrine/collections", - "version": "2.2.1", + "version": "2.2.2", "source": { "type": "git", "url": "https://github.com/doctrine/collections.git", - "reference": "420480fc085bc65f3c956af13abe8e7546f94813" + "reference": "d8af7f248c74f195f7347424600fd9e17b57af59" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/collections/zipball/420480fc085bc65f3c956af13abe8e7546f94813", - "reference": "420480fc085bc65f3c956af13abe8e7546f94813", + "url": "https://api.github.com/repos/doctrine/collections/zipball/d8af7f248c74f195f7347424600fd9e17b57af59", + "reference": "d8af7f248c74f195f7347424600fd9e17b57af59", "shasum": "" }, "require": { @@ -240,7 +240,7 @@ ], "support": { "issues": "https://github.com/doctrine/collections/issues", - "source": "https://github.com/doctrine/collections/tree/2.2.1" + "source": "https://github.com/doctrine/collections/tree/2.2.2" }, "funding": [ { @@ -256,20 +256,20 @@ "type": "tidelift" } ], - "time": "2024-03-05T22:28:45+00:00" + "time": "2024-04-18T06:56:21+00:00" }, { "name": "doctrine/dbal", - "version": "4.0.1", + "version": "4.0.2", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "9e588fe1f38a443cb17de6b86b803d9e028e2156" + "reference": "61d79c6e379a39dc1fea6b4e50a23dfc3cd2076a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/9e588fe1f38a443cb17de6b86b803d9e028e2156", - "reference": "9e588fe1f38a443cb17de6b86b803d9e028e2156", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/61d79c6e379a39dc1fea6b4e50a23dfc3cd2076a", + "reference": "61d79c6e379a39dc1fea6b4e50a23dfc3cd2076a", "shasum": "" }, "require": { @@ -348,7 +348,7 @@ ], "support": { "issues": "https://github.com/doctrine/dbal/issues", - "source": "https://github.com/doctrine/dbal/tree/4.0.1" + "source": "https://github.com/doctrine/dbal/tree/4.0.2" }, "funding": [ { @@ -364,7 +364,7 @@ "type": "tidelift" } ], - "time": "2024-03-03T15:59:11+00:00" + "time": "2024-04-25T08:29:52+00:00" }, { "name": "doctrine/deprecations", @@ -1057,16 +1057,16 @@ }, { "name": "doctrine/orm", - "version": "3.1.1", + "version": "3.1.2", "source": { "type": "git", "url": "https://github.com/doctrine/orm.git", - "reference": "9c560713925ac5859342e6ff370c4c997acf2fd4" + "reference": "f79d166a4e844beb9389f23bdb44abdbf58cec38" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/orm/zipball/9c560713925ac5859342e6ff370c4c997acf2fd4", - "reference": "9c560713925ac5859342e6ff370c4c997acf2fd4", + "url": "https://api.github.com/repos/doctrine/orm/zipball/f79d166a4e844beb9389f23bdb44abdbf58cec38", + "reference": "f79d166a4e844beb9389f23bdb44abdbf58cec38", "shasum": "" }, "require": { @@ -1139,9 +1139,9 @@ ], "support": { "issues": "https://github.com/doctrine/orm/issues", - "source": "https://github.com/doctrine/orm/tree/3.1.1" + "source": "https://github.com/doctrine/orm/tree/3.1.2" }, - "time": "2024-03-21T11:37:52+00:00" + "time": "2024-04-15T14:20:40+00:00" }, { "name": "doctrine/persistence", @@ -1358,20 +1358,20 @@ "type": "github" } ], - "time": "2022-06-18T20:57:19+00:00" + "time": "2023-10-06T06:47:41+00:00" }, { "name": "elastic/transport", - "version": "v8.6.0", + "version": "v8.8.0", "source": { "type": "git", - "url": "git@github.com:elastic/elastic-transport-php.git", - "reference": "b1d761549cebddf2add49921ef67242897b635df" + "url": "https://github.com/elastic/elastic-transport-php.git", + "reference": "cdf9f63a16ec6bfb4c881ab89aa0e2a61fb7c20b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/elastic/elastic-transport-php/zipball/b1d761549cebddf2add49921ef67242897b635df", - "reference": "b1d761549cebddf2add49921ef67242897b635df", + "url": "https://api.github.com/repos/elastic/elastic-transport-php/zipball/cdf9f63a16ec6bfb4c881ab89aa0e2a61fb7c20b", + "reference": "cdf9f63a16ec6bfb4c881ab89aa0e2a61fb7c20b", "shasum": "" }, "require": { @@ -1381,7 +1381,7 @@ "php-http/httplug": "^2.3", "psr/http-client": "^1.0", "psr/http-factory": "^1.0", - "psr/http-message": "^1.0", + "psr/http-message": "^1.0 || ^2.0", "psr/log": "^1 || ^2 || ^3" }, "require-dev": { @@ -1409,28 +1409,32 @@ "psr-7", "transport" ], - "time": "2023-01-11T13:46:07+00:00" + "support": { + "issues": "https://github.com/elastic/elastic-transport-php/issues", + "source": "https://github.com/elastic/elastic-transport-php/tree/v8.8.0" + }, + "time": "2023-11-08T10:51:51+00:00" }, { "name": "elasticsearch/elasticsearch", - "version": "v8.6.1", + "version": "v8.13.0", "source": { "type": "git", - "url": "git@github.com:elastic/elasticsearch-php.git", - "reference": "b3af4309bc73fa3b2a1e19f04f9f201916c11417" + "url": "https://github.com/elastic/elasticsearch-php.git", + "reference": "221723e9497515ec82833995a97c8546d9b6499a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/elastic/elasticsearch-php/zipball/b3af4309bc73fa3b2a1e19f04f9f201916c11417", - "reference": "b3af4309bc73fa3b2a1e19f04f9f201916c11417", + "url": "https://api.github.com/repos/elastic/elasticsearch-php/zipball/221723e9497515ec82833995a97c8546d9b6499a", + "reference": "221723e9497515ec82833995a97c8546d9b6499a", "shasum": "" }, "require": { - "elastic/transport": "^8.5", + "elastic/transport": "^8.8", "guzzlehttp/guzzle": "^7.0", "php": "^7.4 || ^8.0", "psr/http-client": "^1.0", - "psr/http-message": "^1.0", + "psr/http-message": "^1.1 || ^2.0", "psr/log": "^1|^2|^3" }, "require-dev": { @@ -1438,11 +1442,13 @@ "ext-zip": "*", "mockery/mockery": "^1.5", "nyholm/psr7": "^1.5", + "php-http/message-factory": "^1.0", "php-http/mock-client": "^1.5", "phpstan/phpstan": "^1.4", "phpunit/phpunit": "^9.5", + "psr/http-factory": "^1.0", "symfony/finder": "~4.0", - "symfony/http-client": "^5.0|^6.0" + "symfony/http-client": "^5.0|^6.0|^7.0" }, "type": "library", "autoload": { @@ -1461,7 +1467,11 @@ "elasticsearch", "search" ], - "time": "2023-01-19T09:15:22+00:00" + "support": { + "issues": "https://github.com/elastic/elasticsearch-php/issues", + "source": "https://github.com/elastic/elasticsearch-php/tree/v8.13.0" + }, + "time": "2024-03-27T15:09:06+00:00" }, { "name": "friendsofphp/proxy-manager-lts", @@ -1543,26 +1553,26 @@ "type": "tidelift" } ], - "time": "2022-05-05T09:31:05+00:00" + "time": "2024-03-20T12:50:41+00:00" }, { "name": "guzzlehttp/guzzle", - "version": "7.5.0", + "version": "7.8.1", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "b50a2a1251152e43f6a37f0fa053e730a67d25ba" + "reference": "41042bc7ab002487b876a0683fc8dce04ddce104" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/b50a2a1251152e43f6a37f0fa053e730a67d25ba", - "reference": "b50a2a1251152e43f6a37f0fa053e730a67d25ba", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/41042bc7ab002487b876a0683fc8dce04ddce104", + "reference": "41042bc7ab002487b876a0683fc8dce04ddce104", "shasum": "" }, "require": { "ext-json": "*", - "guzzlehttp/promises": "^1.5", - "guzzlehttp/psr7": "^1.9 || ^2.4", + "guzzlehttp/promises": "^1.5.3 || ^2.0.1", + "guzzlehttp/psr7": "^1.9.1 || ^2.5.1", "php": "^7.2.5 || ^8.0", "psr/http-client": "^1.0", "symfony/deprecation-contracts": "^2.2 || ^3.0" @@ -1571,10 +1581,11 @@ "psr/http-client-implementation": "1.0" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.8.1", + "bamarni/composer-bin-plugin": "^1.8.2", "ext-curl": "*", - "php-http/client-integration-tests": "^3.0", - "phpunit/phpunit": "^8.5.29 || ^9.5.23", + "php-http/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999", + "php-http/message-factory": "^1.1", + "phpunit/phpunit": "^8.5.36 || ^9.6.15", "psr/log": "^1.1 || ^2.0 || ^3.0" }, "suggest": { @@ -1587,9 +1598,6 @@ "bamarni-bin": { "bin-links": true, "forward-command": false - }, - "branch-alias": { - "dev-master": "7.5-dev" } }, "autoload": { @@ -1655,7 +1663,7 @@ ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.5.0" + "source": "https://github.com/guzzle/guzzle/tree/7.8.1" }, "funding": [ { @@ -1671,38 +1679,37 @@ "type": "tidelift" } ], - "time": "2022-08-28T15:39:27+00:00" + "time": "2023-12-03T20:35:24+00:00" }, { "name": "guzzlehttp/promises", - "version": "1.5.2", + "version": "2.0.2", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "b94b2807d85443f9719887892882d0329d1e2598" + "reference": "bbff78d96034045e58e13dedd6ad91b5d1253223" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/b94b2807d85443f9719887892882d0329d1e2598", - "reference": "b94b2807d85443f9719887892882d0329d1e2598", + "url": "https://api.github.com/repos/guzzle/promises/zipball/bbff78d96034045e58e13dedd6ad91b5d1253223", + "reference": "bbff78d96034045e58e13dedd6ad91b5d1253223", "shasum": "" }, "require": { - "php": ">=5.5" + "php": "^7.2.5 || ^8.0" }, "require-dev": { - "symfony/phpunit-bridge": "^4.4 || ^5.1" + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.36 || ^9.6.15" }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "1.5-dev" + "bamarni-bin": { + "bin-links": true, + "forward-command": false } }, "autoload": { - "files": [ - "src/functions_include.php" - ], "psr-4": { "GuzzleHttp\\Promise\\": "src/" } @@ -1739,7 +1746,7 @@ ], "support": { "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/1.5.2" + "source": "https://github.com/guzzle/promises/tree/2.0.2" }, "funding": [ { @@ -1755,26 +1762,26 @@ "type": "tidelift" } ], - "time": "2022-08-28T14:55:35+00:00" + "time": "2023-12-03T20:19:20+00:00" }, { "name": "guzzlehttp/psr7", - "version": "2.4.3", + "version": "2.6.2", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "67c26b443f348a51926030c83481b85718457d3d" + "reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/67c26b443f348a51926030c83481b85718457d3d", - "reference": "67c26b443f348a51926030c83481b85718457d3d", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/45b30f99ac27b5ca93cb4831afe16285f57b8221", + "reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221", "shasum": "" }, "require": { "php": "^7.2.5 || ^8.0", "psr/http-factory": "^1.0", - "psr/http-message": "^1.0", + "psr/http-message": "^1.1 || ^2.0", "ralouphie/getallheaders": "^3.0" }, "provide": { @@ -1782,9 +1789,9 @@ "psr/http-message-implementation": "1.0" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.8.1", + "bamarni/composer-bin-plugin": "^1.8.2", "http-interop/http-factory-tests": "^0.9", - "phpunit/phpunit": "^8.5.29 || ^9.5.23" + "phpunit/phpunit": "^8.5.36 || ^9.6.15" }, "suggest": { "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" @@ -1794,9 +1801,6 @@ "bamarni-bin": { "bin-links": true, "forward-command": false - }, - "branch-alias": { - "dev-master": "2.4-dev" } }, "autoload": { @@ -1858,7 +1862,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.4.3" + "source": "https://github.com/guzzle/psr7/tree/2.6.2" }, "funding": [ { @@ -1874,7 +1878,7 @@ "type": "tidelift" } ], - "time": "2022-10-26T14:07:24+00:00" + "time": "2023-12-03T20:05:35+00:00" }, { "name": "laminas/laminas-code", @@ -2038,20 +2042,20 @@ "type": "tidelift" } ], - "time": "2022-07-24T12:00:55+00:00" + "time": "2024-04-12T21:02:21+00:00" }, { "name": "php-http/discovery", - "version": "1.15.2", + "version": "1.19.4", "source": { "type": "git", "url": "https://github.com/php-http/discovery.git", - "reference": "5cc428320191ac1d0b6520034c2dc0698628ced5" + "reference": "0700efda8d7526335132360167315fdab3aeb599" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/discovery/zipball/5cc428320191ac1d0b6520034c2dc0698628ced5", - "reference": "5cc428320191ac1d0b6520034c2dc0698628ced5", + "url": "https://api.github.com/repos/php-http/discovery/zipball/0700efda8d7526335132360167315fdab3aeb599", + "reference": "0700efda8d7526335132360167315fdab3aeb599", "shasum": "" }, "require": { @@ -2059,7 +2063,8 @@ "php": "^7.1 || ^8.0" }, "conflict": { - "nyholm/psr7": "<1.0" + "nyholm/psr7": "<1.0", + "zendframework/zend-diactoros": "*" }, "provide": { "php-http/async-client-implementation": "*", @@ -2074,7 +2079,8 @@ "php-http/httplug": "^1.0 || ^2.0", "php-http/message-factory": "^1.0", "phpspec/phpspec": "^5.1 || ^6.1 || ^7.3", - "symfony/phpunit-bridge": "^6.2" + "sebastian/comparator": "^3.0.5 || ^4.0.8", + "symfony/phpunit-bridge": "^6.4.4 || ^7.0.1" }, "type": "composer-plugin", "extra": { @@ -2084,7 +2090,10 @@ "autoload": { "psr-4": { "Http\\Discovery\\": "src/" - } + }, + "exclude-from-classmap": [ + "src/Composer/Plugin.php" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -2110,40 +2119,35 @@ ], "support": { "issues": "https://github.com/php-http/discovery/issues", - "source": "https://github.com/php-http/discovery/tree/1.15.2" + "source": "https://github.com/php-http/discovery/tree/1.19.4" }, - "time": "2023-02-11T08:28:41+00:00" + "time": "2024-03-29T13:00:05+00:00" }, { "name": "php-http/httplug", - "version": "2.3.0", + "version": "2.4.0", "source": { "type": "git", "url": "https://github.com/php-http/httplug.git", - "reference": "f640739f80dfa1152533976e3c112477f69274eb" + "reference": "625ad742c360c8ac580fcc647a1541d29e257f67" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/httplug/zipball/f640739f80dfa1152533976e3c112477f69274eb", - "reference": "f640739f80dfa1152533976e3c112477f69274eb", + "url": "https://api.github.com/repos/php-http/httplug/zipball/625ad742c360c8ac580fcc647a1541d29e257f67", + "reference": "625ad742c360c8ac580fcc647a1541d29e257f67", "shasum": "" }, "require": { "php": "^7.1 || ^8.0", "php-http/promise": "^1.1", "psr/http-client": "^1.0", - "psr/http-message": "^1.0" + "psr/http-message": "^1.0 || ^2.0" }, "require-dev": { - "friends-of-phpspec/phpspec-code-coverage": "^4.1", - "phpspec/phpspec": "^5.1 || ^6.0" + "friends-of-phpspec/phpspec-code-coverage": "^4.1 || ^5.0 || ^6.0", + "phpspec/phpspec": "^5.1 || ^6.0 || ^7.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.x-dev" - } - }, "autoload": { "psr-4": { "Http\\Client\\": "src/" @@ -2172,37 +2176,32 @@ ], "support": { "issues": "https://github.com/php-http/httplug/issues", - "source": "https://github.com/php-http/httplug/tree/2.3.0" + "source": "https://github.com/php-http/httplug/tree/2.4.0" }, - "time": "2022-02-21T09:52:22+00:00" + "time": "2023-04-14T15:10:03+00:00" }, { "name": "php-http/promise", - "version": "1.1.0", + "version": "1.3.1", "source": { "type": "git", "url": "https://github.com/php-http/promise.git", - "reference": "4c4c1f9b7289a2ec57cde7f1e9762a5789506f88" + "reference": "fc85b1fba37c169a69a07ef0d5a8075770cc1f83" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/promise/zipball/4c4c1f9b7289a2ec57cde7f1e9762a5789506f88", - "reference": "4c4c1f9b7289a2ec57cde7f1e9762a5789506f88", + "url": "https://api.github.com/repos/php-http/promise/zipball/fc85b1fba37c169a69a07ef0d5a8075770cc1f83", + "reference": "fc85b1fba37c169a69a07ef0d5a8075770cc1f83", "shasum": "" }, "require": { "php": "^7.1 || ^8.0" }, "require-dev": { - "friends-of-phpspec/phpspec-code-coverage": "^4.3.2", - "phpspec/phpspec": "^5.1.2 || ^6.2" + "friends-of-phpspec/phpspec-code-coverage": "^4.3.2 || ^6.3", + "phpspec/phpspec": "^5.1.2 || ^6.2 || ^7.4" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1-dev" - } - }, "autoload": { "psr-4": { "Http\\Promise\\": "src/" @@ -2229,9 +2228,9 @@ ], "support": { "issues": "https://github.com/php-http/promise/issues", - "source": "https://github.com/php-http/promise/tree/1.1.0" + "source": "https://github.com/php-http/promise/tree/1.3.1" }, - "time": "2020-07-07T09:29:14+00:00" + "time": "2024-03-15T13:55:21+00:00" }, { "name": "phpdocumentor/reflection-common", @@ -2657,21 +2656,21 @@ }, { "name": "psr/http-client", - "version": "1.0.1", + "version": "1.0.3", "source": { "type": "git", "url": "https://github.com/php-fig/http-client.git", - "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621" + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-client/zipball/2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", - "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", "shasum": "" }, "require": { "php": "^7.0 || ^8.0", - "psr/http-message": "^1.0" + "psr/http-message": "^1.0 || ^2.0" }, "type": "library", "extra": { @@ -2691,7 +2690,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common interface for HTTP clients", @@ -2703,27 +2702,27 @@ "psr-18" ], "support": { - "source": "https://github.com/php-fig/http-client/tree/master" + "source": "https://github.com/php-fig/http-client" }, - "time": "2020-06-29T06:28:15+00:00" + "time": "2023-09-23T14:17:50+00:00" }, { "name": "psr/http-factory", - "version": "1.0.1", + "version": "1.0.2", "source": { "type": "git", "url": "https://github.com/php-fig/http-factory.git", - "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be" + "reference": "e616d01114759c4c489f93b099585439f795fe35" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-factory/zipball/12ac7fcd07e5b077433f5f2bee95b3a771bf61be", - "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/e616d01114759c4c489f93b099585439f795fe35", + "reference": "e616d01114759c4c489f93b099585439f795fe35", "shasum": "" }, "require": { "php": ">=7.0.0", - "psr/http-message": "^1.0" + "psr/http-message": "^1.0 || ^2.0" }, "type": "library", "extra": { @@ -2743,7 +2742,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common interfaces for PSR-7 HTTP message factories", @@ -2758,31 +2757,31 @@ "response" ], "support": { - "source": "https://github.com/php-fig/http-factory/tree/master" + "source": "https://github.com/php-fig/http-factory/tree/1.0.2" }, - "time": "2019-04-30T12:38:16+00:00" + "time": "2023-04-10T20:10:41+00:00" }, { "name": "psr/http-message", - "version": "1.0.1", + "version": "2.0", "source": { "type": "git", "url": "https://github.com/php-fig/http-message.git", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": "^7.2 || ^8.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "2.0.x-dev" } }, "autoload": { @@ -2797,7 +2796,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common interface for HTTP messages", @@ -2811,9 +2810,9 @@ "response" ], "support": { - "source": "https://github.com/php-fig/http-message/tree/master" + "source": "https://github.com/php-fig/http-message/tree/2.0" }, - "time": "2016-08-06T14:39:51+00:00" + "time": "2023-04-04T09:54:51+00:00" }, { "name": "psr/link", @@ -2965,84 +2964,6 @@ }, "time": "2019-03-08T08:55:37+00:00" }, - { - "name": "sensio/framework-extra-bundle", - "version": "v6.2.8", - "source": { - "type": "git", - "url": "https://github.com/sensiolabs/SensioFrameworkExtraBundle.git", - "reference": "bb962f8aed09e60b0942545f6e4842ffeee4aafd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sensiolabs/SensioFrameworkExtraBundle/zipball/bb962f8aed09e60b0942545f6e4842ffeee4aafd", - "reference": "bb962f8aed09e60b0942545f6e4842ffeee4aafd", - "shasum": "" - }, - "require": { - "doctrine/annotations": "^1.0", - "php": ">=7.2.5", - "symfony/config": "^4.4|^5.0|^6.0", - "symfony/dependency-injection": "^4.4|^5.0|^6.0", - "symfony/framework-bundle": "^4.4|^5.0|^6.0", - "symfony/http-kernel": "^4.4|^5.0|^6.0" - }, - "conflict": { - "doctrine/doctrine-cache-bundle": "<1.3.1", - "doctrine/persistence": "<1.3" - }, - "require-dev": { - "doctrine/dbal": "^2.10|^3.0", - "doctrine/doctrine-bundle": "^1.11|^2.0", - "doctrine/orm": "^2.5", - "symfony/browser-kit": "^4.4|^5.0|^6.0", - "symfony/doctrine-bridge": "^4.4|^5.0|^6.0", - "symfony/dom-crawler": "^4.4|^5.0|^6.0", - "symfony/expression-language": "^4.4|^5.0|^6.0", - "symfony/finder": "^4.4|^5.0|^6.0", - "symfony/monolog-bridge": "^4.0|^5.0|^6.0", - "symfony/monolog-bundle": "^3.2", - "symfony/phpunit-bridge": "^4.4.9|^5.0.9|^6.0", - "symfony/security-bundle": "^4.4|^5.0|^6.0", - "symfony/twig-bundle": "^4.4|^5.0|^6.0", - "symfony/yaml": "^4.4|^5.0|^6.0", - "twig/twig": "^1.34|^2.4|^3.0" - }, - "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "6.1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Sensio\\Bundle\\FrameworkExtraBundle\\": "src/" - }, - "exclude-from-classmap": [ - "/tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - } - ], - "description": "This bundle provides a way to configure your controllers with annotations", - "keywords": [ - "annotations", - "controllers" - ], - "support": { - "issues": "https://github.com/sensiolabs/SensioFrameworkExtraBundle/issues", - "source": "https://github.com/sensiolabs/SensioFrameworkExtraBundle/tree/v6.2.8" - }, - "time": "2022-09-05T16:44:56+00:00" - }, { "name": "symfony/asset", "version": "v7.0.3", @@ -3781,31 +3702,31 @@ }, { "name": "symfony/doctrine-messenger", - "version": "v6.1.11", + "version": "v7.0.6", "source": { "type": "git", "url": "https://github.com/symfony/doctrine-messenger.git", - "reference": "e4b775d2dadcc801d2404c701555c2638690811e" + "reference": "227cbb2cda296d724a8e08376ad6db73a0335538" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-messenger/zipball/e4b775d2dadcc801d2404c701555c2638690811e", - "reference": "e4b775d2dadcc801d2404c701555c2638690811e", + "url": "https://api.github.com/repos/symfony/doctrine-messenger/zipball/227cbb2cda296d724a8e08376ad6db73a0335538", + "reference": "227cbb2cda296d724a8e08376ad6db73a0335538", "shasum": "" }, "require": { - "doctrine/dbal": "^2.13|^3.0", - "php": ">=8.1", - "symfony/messenger": "^5.4|^6.0", - "symfony/service-contracts": "^1.1|^2|^3" + "doctrine/dbal": "^3.6|^4", + "php": ">=8.2", + "symfony/messenger": "^6.4|^7.0", + "symfony/service-contracts": "^2.5|^3" }, "conflict": { "doctrine/persistence": "<1.3" }, "require-dev": { "doctrine/persistence": "^1.3|^2|^3", - "symfony/property-access": "^5.4|^6.0", - "symfony/serializer": "^5.4|^6.0" + "symfony/property-access": "^6.4|^7.0", + "symfony/serializer": "^6.4|^7.0" }, "type": "symfony-messenger-bridge", "autoload": { @@ -3833,7 +3754,7 @@ "description": "Symfony Doctrine Messenger Bridge", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/doctrine-messenger/tree/v6.1.11" + "source": "https://github.com/symfony/doctrine-messenger/tree/v7.0.6" }, "funding": [ { @@ -3849,7 +3770,7 @@ "type": "tidelift" } ], - "time": "2023-01-01T08:36:55+00:00" + "time": "2024-03-19T09:26:35+00:00" }, { "name": "symfony/dotenv", @@ -5096,28 +5017,29 @@ }, { "name": "symfony/lock", - "version": "v6.1.11", + "version": "v7.0.6", "source": { "type": "git", "url": "https://github.com/symfony/lock.git", - "reference": "cbc3366559a568ed56d9e7ed6d8e29a083eebb5b" + "reference": "c1fc92e5ba2a4d397751ac0df06689a187059402" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/lock/zipball/cbc3366559a568ed56d9e7ed6d8e29a083eebb5b", - "reference": "cbc3366559a568ed56d9e7ed6d8e29a083eebb5b", + "url": "https://api.github.com/repos/symfony/lock/zipball/c1fc92e5ba2a4d397751ac0df06689a187059402", + "reference": "c1fc92e5ba2a4d397751ac0df06689a187059402", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "psr/log": "^1|^2|^3" }, "conflict": { - "doctrine/dbal": "<2.13" + "doctrine/dbal": "<3.6", + "symfony/cache": "<6.4" }, "require-dev": { - "doctrine/dbal": "^2.13|^3.0", - "predis/predis": "~1.0" + "doctrine/dbal": "^3.6|^4", + "predis/predis": "^1.1|^2.0" }, "type": "library", "autoload": { @@ -5153,7 +5075,7 @@ "semaphore" ], "support": { - "source": "https://github.com/symfony/lock/tree/v6.1.11" + "source": "https://github.com/symfony/lock/tree/v7.0.6" }, "funding": [ { @@ -5169,7 +5091,7 @@ "type": "tidelift" } ], - "time": "2023-01-01T08:36:55+00:00" + "time": "2024-03-19T09:26:35+00:00" }, { "name": "symfony/mailer", @@ -5253,45 +5175,45 @@ }, { "name": "symfony/messenger", - "version": "v6.1.6", + "version": "v7.0.6", "source": { "type": "git", "url": "https://github.com/symfony/messenger.git", - "reference": "3d7fbc507ad31e71a96e8e65342243e2dbe22fa1" + "reference": "4e281ef8bf5397be36fe14d64eb665fa12a945ad" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/messenger/zipball/3d7fbc507ad31e71a96e8e65342243e2dbe22fa1", - "reference": "3d7fbc507ad31e71a96e8e65342243e2dbe22fa1", + "url": "https://api.github.com/repos/symfony/messenger/zipball/4e281ef8bf5397be36fe14d64eb665fa12a945ad", + "reference": "4e281ef8bf5397be36fe14d64eb665fa12a945ad", "shasum": "" }, "require": { - "php": ">=8.1", - "psr/log": "^1|^2|^3" + "php": ">=8.2", + "psr/log": "^1|^2|^3", + "symfony/clock": "^6.4|^7.0" }, "conflict": { - "symfony/event-dispatcher": "<5.4", - "symfony/event-dispatcher-contracts": "<2", - "symfony/framework-bundle": "<5.4", - "symfony/http-kernel": "<5.4", - "symfony/serializer": "<5.4" + "symfony/console": "<6.4", + "symfony/event-dispatcher": "<6.4", + "symfony/event-dispatcher-contracts": "<2.5", + "symfony/framework-bundle": "<6.4", + "symfony/http-kernel": "<6.4", + "symfony/serializer": "<6.4" }, "require-dev": { "psr/cache": "^1.0|^2.0|^3.0", - "symfony/console": "^5.4|^6.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/event-dispatcher": "^5.4|^6.0", - "symfony/http-kernel": "^5.4|^6.0", - "symfony/process": "^5.4|^6.0", - "symfony/property-access": "^5.4|^6.0", - "symfony/routing": "^5.4|^6.0", - "symfony/serializer": "^5.4|^6.0", - "symfony/service-contracts": "^1.1|^2|^3", - "symfony/stopwatch": "^5.4|^6.0", - "symfony/validator": "^5.4|^6.0" - }, - "suggest": { - "enqueue/messenger-adapter": "For using the php-enqueue library as a transport." + "symfony/console": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/event-dispatcher": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0", + "symfony/property-access": "^6.4|^7.0", + "symfony/rate-limiter": "^6.4|^7.0", + "symfony/routing": "^6.4|^7.0", + "symfony/serializer": "^6.4|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/stopwatch": "^6.4|^7.0", + "symfony/validator": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -5319,7 +5241,7 @@ "description": "Helps applications send and receive messages to/from other applications or via message queues", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/messenger/tree/v6.1.6" + "source": "https://github.com/symfony/messenger/tree/v7.0.6" }, "funding": [ { @@ -5335,7 +5257,7 @@ "type": "tidelift" } ], - "time": "2022-10-10T09:34:31+00:00" + "time": "2024-03-19T11:57:22+00:00" }, { "name": "symfony/mime", @@ -6282,36 +6204,28 @@ "type": "tidelift" } ], - "time": "2022-05-10T07:21:04+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { - "name": "symfony/polyfill-uuid", - "version": "v1.27.0", + "name": "symfony/polyfill-php83", + "version": "v1.29.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-uuid.git", - "reference": "f3cf1a645c2734236ed1e2e671e273eeb3586166" + "url": "https://github.com/symfony/polyfill-php83.git", + "reference": "86fcae159633351e5fd145d1c47de6c528f8caff" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/f3cf1a645c2734236ed1e2e671e273eeb3586166", - "reference": "f3cf1a645c2734236ed1e2e671e273eeb3586166", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/86fcae159633351e5fd145d1c47de6c528f8caff", + "reference": "86fcae159633351e5fd145d1c47de6c528f8caff", "shasum": "" }, "require": { - "php": ">=7.1" - }, - "provide": { - "ext-uuid": "*" - }, - "suggest": { - "ext-uuid": "For best performance" + "php": ">=7.1", + "symfony/polyfill-php80": "^1.14" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.27-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -6322,8 +6236,11 @@ "bootstrap.php" ], "psr-4": { - "Symfony\\Polyfill\\Uuid\\": "" - } + "Symfony\\Polyfill\\Php83\\": "" + }, + "classmap": [ + "Resources/stubs" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -6331,24 +6248,24 @@ ], "authors": [ { - "name": "GrĂ©goire Pineau", - "email": "lyrixx@lyrixx.info" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill for uuid functions", + "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ "compatibility", "polyfill", "portable", - "uuid" + "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-uuid/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-php83/tree/v1.29.0" }, "funding": [ { @@ -6364,7 +6281,7 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/process", @@ -7850,81 +7767,7 @@ "type": "tidelift" } ], - "time": "2022-05-27T16:55:36+00:00" - }, - { - "name": "symfony/uid", - "version": "v6.1.11", - "source": { - "type": "git", - "url": "https://github.com/symfony/uid.git", - "reference": "7c53913df24517eb5e0fab4caf294e84fcecc277" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/uid/zipball/7c53913df24517eb5e0fab4caf294e84fcecc277", - "reference": "7c53913df24517eb5e0fab4caf294e84fcecc277", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "symfony/polyfill-uuid": "^1.15" - }, - "require-dev": { - "symfony/console": "^5.4|^6.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Uid\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "GrĂ©goire Pineau", - "email": "lyrixx@lyrixx.info" - }, - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides an object-oriented API to generate and represent UIDs", - "homepage": "https://symfony.com", - "keywords": [ - "UID", - "ulid", - "uuid" - ], - "support": { - "source": "https://github.com/symfony/uid/tree/v6.1.11" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2023-01-01T08:36:55+00:00" + "time": "2024-02-15T11:33:06+00:00" }, { "name": "symfony/validator", @@ -8335,34 +8178,34 @@ }, { "name": "twig/extra-bundle", - "version": "v3.8.0", + "version": "v3.9.3", "source": { "type": "git", "url": "https://github.com/twigphp/twig-extra-bundle.git", - "reference": "32807183753de0388c8e59f7ac2d13bb47311140" + "reference": "ef6869adf1fdab66f7e495771a7ba01496ffc0d5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/twig-extra-bundle/zipball/32807183753de0388c8e59f7ac2d13bb47311140", - "reference": "32807183753de0388c8e59f7ac2d13bb47311140", + "url": "https://api.github.com/repos/twigphp/twig-extra-bundle/zipball/ef6869adf1fdab66f7e495771a7ba01496ffc0d5", + "reference": "ef6869adf1fdab66f7e495771a7ba01496ffc0d5", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/framework-bundle": "^5.4|^6.0|^7.0", - "symfony/twig-bundle": "^5.4|^6.0|^7.0", + "symfony/framework-bundle": "^5.4|^6.4|^7.0", + "symfony/twig-bundle": "^5.4|^6.4|^7.0", "twig/twig": "^3.0" }, "require-dev": { "league/commonmark": "^1.0|^2.0", "symfony/phpunit-bridge": "^6.4|^7.0", "twig/cache-extra": "^3.0", - "twig/cssinliner-extra": "^2.12|^3.0", - "twig/html-extra": "^2.12|^3.0", - "twig/inky-extra": "^2.12|^3.0", - "twig/intl-extra": "^2.12|^3.0", - "twig/markdown-extra": "^2.12|^3.0", - "twig/string-extra": "^2.12|^3.0" + "twig/cssinliner-extra": "^3.0", + "twig/html-extra": "^3.0", + "twig/inky-extra": "^3.0", + "twig/intl-extra": "^3.0", + "twig/markdown-extra": "^3.0", + "twig/string-extra": "^3.0" }, "type": "symfony-bundle", "autoload": { @@ -8393,7 +8236,7 @@ "twig" ], "support": { - "source": "https://github.com/twigphp/twig-extra-bundle/tree/v3.8.0" + "source": "https://github.com/twigphp/twig-extra-bundle/tree/v3.9.3" }, "funding": [ { @@ -8405,34 +8248,41 @@ "type": "tidelift" } ], - "time": "2023-11-21T14:02:01+00:00" + "time": "2024-04-18T09:24:21+00:00" }, { "name": "twig/twig", - "version": "v3.8.0", + "version": "v3.9.3", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "9d15f0ac07f44dc4217883ec6ae02fd555c6f71d" + "reference": "a842d75fed59cdbcbd3a3ad7fb9eb768fc350d58" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/9d15f0ac07f44dc4217883ec6ae02fd555c6f71d", - "reference": "9d15f0ac07f44dc4217883ec6ae02fd555c6f71d", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/a842d75fed59cdbcbd3a3ad7fb9eb768fc350d58", + "reference": "a842d75fed59cdbcbd3a3ad7fb9eb768fc350d58", "shasum": "" }, "require": { "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-ctype": "^1.8", "symfony/polyfill-mbstring": "^1.3", "symfony/polyfill-php80": "^1.22" }, "require-dev": { "psr/container": "^1.0|^2.0", - "symfony/phpunit-bridge": "^5.4.9|^6.3|^7.0" + "symfony/phpunit-bridge": "^5.4.9|^6.4|^7.0" }, "type": "library", "autoload": { + "files": [ + "src/Resources/core.php", + "src/Resources/debug.php", + "src/Resources/escaper.php", + "src/Resources/string_loader.php" + ], "psr-4": { "Twig\\": "src/" } @@ -8465,7 +8315,7 @@ ], "support": { "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v3.8.0" + "source": "https://github.com/twigphp/Twig/tree/v3.9.3" }, "funding": [ { @@ -8477,7 +8327,7 @@ "type": "tidelift" } ], - "time": "2023-11-21T18:54:41+00:00" + "time": "2024-04-18T11:59:33+00:00" }, { "name": "webmozart/assert", diff --git a/config/doctrine/orm/Dinosaur.orm.xml b/config/doctrine/orm/Dinosaur.orm.xml index eec174e..e1f769d 100644 --- a/config/doctrine/orm/Dinosaur.orm.xml +++ b/config/doctrine/orm/Dinosaur.orm.xml @@ -10,7 +10,9 @@ table="dinosaur" > - + + + diff --git a/config/doctrine/orm/Species.orm.xml b/config/doctrine/orm/Species.orm.xml index dbaa335..100370d 100644 --- a/config/doctrine/orm/Species.orm.xml +++ b/config/doctrine/orm/Species.orm.xml @@ -10,7 +10,9 @@ table="species" > - + + + diff --git a/config/packages/http_discovery.yaml b/config/packages/http_discovery.yaml new file mode 100644 index 0000000..2a789e7 --- /dev/null +++ b/config/packages/http_discovery.yaml @@ -0,0 +1,10 @@ +services: + Psr\Http\Message\RequestFactoryInterface: '@http_discovery.psr17_factory' + Psr\Http\Message\ResponseFactoryInterface: '@http_discovery.psr17_factory' + Psr\Http\Message\ServerRequestFactoryInterface: '@http_discovery.psr17_factory' + Psr\Http\Message\StreamFactoryInterface: '@http_discovery.psr17_factory' + Psr\Http\Message\UploadedFileFactoryInterface: '@http_discovery.psr17_factory' + Psr\Http\Message\UriFactoryInterface: '@http_discovery.psr17_factory' + + http_discovery.psr17_factory: + class: Http\Discovery\Psr17Factory diff --git a/docker-compose.yml b/docker-compose.yml index 880d047..1b86bb5 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -42,16 +42,16 @@ services: - db-data:/var/lib/mysql:rw restart: unless-stopped - elasticsearch: - image: docker.elastic.co/elasticsearch/elasticsearch:7.16.3 - volumes: - - 'elasticsearch:/usr/share/elasticsearch/data' - ports: - - 9200:9200 - environment: - - discovery.type=single-node - - "ES_JAVA_OPTS=-Xms512m -Xmx512m" + elasticsearch: + image: docker.elastic.co/elasticsearch/elasticsearch:7.16.3 + volumes: + - 'elasticsearch:/usr/share/elasticsearch/data' + ports: + - 9200:9200 + environment: + - discovery.type=single-node + - "ES_JAVA_OPTS=-Xms512m -Xmx512m" volumes: - db-data: ~ - elasticsearch: ~ + db-data: ~ + elasticsearch: ~ diff --git a/migrations/Version20230217084031.php b/migrations/Version20230217084031.php deleted file mode 100644 index 7e08774..0000000 --- a/migrations/Version20230217084031.php +++ /dev/null @@ -1,37 +0,0 @@ -addSql('ALTER TABLE dinosaur DROP FOREIGN KEY FK_DAEDC56EB2A1D860'); - $this->addSql('ALTER TABLE dinosaur CHANGE id id BINARY(16) NOT NULL COMMENT \'(DC2Type:uuid)\', CHANGE species_id species_id BINARY(16) DEFAULT NULL COMMENT \'(DC2Type:uuid)\''); - $this->addSql('ALTER TABLE species CHANGE id id BINARY(16) NOT NULL COMMENT \'(DC2Type:uuid)\''); - $this->addSql('ALTER TABLE dinosaur ADD CONSTRAINT FK_DAEDC56EB2A1D860 FOREIGN KEY (species_id) REFERENCES species (id)'); - } - - public function down(Schema $schema): void - { - // this down() migration is auto-generated, please modify it to your needs - $this->addSql('ALTER TABLE dinosaur DROP FOREIGN KEY FK_DAEDC56EB2A1D860'); - $this->addSql('ALTER TABLE dinosaur CHANGE id id INT AUTO_INCREMENT NOT NULL, CHANGE species_id species_id INT DEFAULT NULL'); - $this->addSql('ALTER TABLE species CHANGE id id INT AUTO_INCREMENT NOT NULL'); - $this->addSql('ALTER TABLE dinosaur ADD CONSTRAINT FK_DAEDC56EB2A1D860 FOREIGN KEY (species_id) REFERENCES species (id)'); - } -} diff --git a/src/Command/ConsumeCommand.php b/src/Command/ConsumeCommand.php index 3c55025..20f9ca8 100644 --- a/src/Command/ConsumeCommand.php +++ b/src/Command/ConsumeCommand.php @@ -7,14 +7,14 @@ use App\Message\Food\Consume; use App\Repository\DinosaurRepository; use Symfony\Component\Console\Command\Command; +use Symfony\Component\Console\Attribute\AsCommand; use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Messenger\MessageBusInterface; +use Symfony\Component\Console\Output\OutputInterface; +#[AsCommand(name: 'app:food:consume')] class ConsumeCommand extends Command { - protected static $defaultName = 'app:food:consume'; - public function __construct( private MessageBusInterface $bus, private DinosaurRepository $dinosaurRepository @@ -30,8 +30,8 @@ protected function configure(): void ; } - protected function execute(InputInterface $input, OutputInterface $output) - { + protected function execute(InputInterface $input, OutputInterface $output): int + { $dinosaurs = $this->dinosaurRepository->findAll(); for ($i = 0; $i < 100; $i++) { @@ -39,10 +39,7 @@ protected function execute(InputInterface $input, OutputInterface $output) $dinosaur = $dinosaurs[$randomDinoKey]; - $consumeMessage = new Consume( - $dinosaur->getId()->toRfc4122(), - $dinosaur->getName() - ); + $consumeMessage = new Consume($dinosaur->getId(), $dinosaur->getName()); $this->bus->dispatch($consumeMessage); } diff --git a/src/Command/RefillCommand.php b/src/Command/RefillCommand.php index dc84b9f..fe27627 100644 --- a/src/Command/RefillCommand.php +++ b/src/Command/RefillCommand.php @@ -6,14 +6,14 @@ use App\Message\Food\Refill; use Symfony\Component\Console\Command\Command; +use Symfony\Component\Console\Attribute\AsCommand; use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Messenger\MessageBusInterface; +use Symfony\Component\Console\Output\OutputInterface; +#[AsCommand(name: 'app:food:refill')] class RefillCommand extends Command { - protected static $defaultName = 'app:food:refill'; - public function __construct( private MessageBusInterface $bus ) { @@ -28,7 +28,7 @@ protected function configure(): void ; } - protected function execute(InputInterface $input, OutputInterface $output) + protected function execute(InputInterface $input, OutputInterface $output): int { $this->bus->dispatch(new Refill()); diff --git a/src/Controller/DinosaursController.php b/src/Controller/DinosaursController.php index d4d5725..14d7e43 100644 --- a/src/Controller/DinosaursController.php +++ b/src/Controller/DinosaursController.php @@ -49,7 +49,7 @@ public function list(Request $request, ManagerRegistry $doctrine): Response #[Route( '/dinosaurs/{id}', name: 'app_single_dinosaur', - requirements: ['id' => '^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$'] + requirements: ['id' => '\d+'] )] public function single(string $id, ManagerRegistry $doctrine): Response { @@ -101,7 +101,7 @@ public function create(Request $request): Response #[Route( '/dinosaurs/{id}/edit', name: 'app_edit_dinosaur', - requirements: ['id' => '^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$'] + requirements: ['id' => '\d+'] )] public function edit(Request $request, string $id, ManagerRegistry $doctrine): Response { @@ -142,7 +142,7 @@ public function edit(Request $request, string $id, ManagerRegistry $doctrine): R #[Route( '/dinosaurs/{id}/remove', name: 'app_remove_dinosaur', - requirements: ['id' => '^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$'] + requirements: ['id' => '\d+'] )] public function remove(string $id): Response { diff --git a/src/Controller/SpeciesController.php b/src/Controller/SpeciesController.php index 0fe9960..54d0cc9 100644 --- a/src/Controller/SpeciesController.php +++ b/src/Controller/SpeciesController.php @@ -65,7 +65,7 @@ public function create(Request $request, ManagerRegistry $doctrine): Response #[Route( '/species/{id}/edit', name: 'app_edit_species', - requirements: ['id' => '^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$'] + requirements: ['id' => '\d+'] )] public function edit(Request $request, string $id, ManagerRegistry $doctrine): Response { @@ -104,7 +104,7 @@ public function edit(Request $request, string $id, ManagerRegistry $doctrine): R #[Route( '/species/{id}/remove', name: 'app_remove_species', - requirements: ['id' => '^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$'] + requirements: ['id' => '\d+'] )] public function remove(string $id): Response { diff --git a/src/DataFixtures/AppFixtures.php b/src/DataFixtures/AppFixtures.php index fc71111..adb9527 100644 --- a/src/DataFixtures/AppFixtures.php +++ b/src/DataFixtures/AppFixtures.php @@ -2,6 +2,7 @@ namespace App\DataFixtures; +use App\Entity\Park; use App\Entity\Dinosaur; use App\Entity\Species; use App\Entity\User; @@ -115,6 +116,10 @@ public function load(ObjectManager $manager): void $manager->flush(); + $park = new Park('Jurassic Park', 100); + $manager->persist($park); + $manager->flush(); + /** * Create dinosaurs. */ @@ -133,7 +138,8 @@ public function load(ObjectManager $manager): void $gender[array_rand($gender)], $speciesList[array_rand($speciesList)], rand(1, 40), - '#000000' + '#000000', + $park ); $manager->persist($dinosaur); diff --git a/src/Entity/Dinosaur.php b/src/Entity/Dinosaur.php index ae2045b..8e324a9 100644 --- a/src/Entity/Dinosaur.php +++ b/src/Entity/Dinosaur.php @@ -2,8 +2,6 @@ namespace App\Entity; -use Symfony\Component\Uid\Uuid; - class Dinosaur { private int $id; @@ -15,21 +13,14 @@ public function __construct( private int $age, private string $eyesColor, private Park $park, - ?Uuid $id = null ) { - $this->id = $id ?? Uuid::v4(); } - public function getId(): ?Uuid + public function getId(): int { return $this->id; } - public function setId(?Uuid $id): void - { - $this->id = $id; - } - public function getName(): string { return $this->name; diff --git a/src/Entity/Park.php b/src/Entity/Park.php index 31180a0..d81061c 100644 --- a/src/Entity/Park.php +++ b/src/Entity/Park.php @@ -5,6 +5,7 @@ namespace App\Entity; use App\Entity\Dinosaur; +use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\Collection; class Park @@ -23,7 +24,7 @@ public function __construct( ) { $this->name = $name; $this->foodAmount = $foodAmount; - $this->dinosaurs = []; + $this->dinosaurs = new ArrayCollection(); } public function addDinosaurs(Dinosaur ...$dinosaur): void diff --git a/src/Entity/Species.php b/src/Entity/Species.php index e49365f..b5e1f54 100644 --- a/src/Entity/Species.php +++ b/src/Entity/Species.php @@ -4,33 +4,25 @@ use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\Collection; -use Symfony\Component\Uid\Uuid; class Species { - private ?Uuid $id; + private int $id; private Collection $dinosaurs; public function __construct( private string $name, private array $habitats, private string $feeding, - ?Uuid $id = null ) { - $this->id = $id ?? Uuid::v4(); $this->dinosaurs = new ArrayCollection(); } - public function getId(): ?Uuid + public function getId(): int { return $this->id; } - public function setId(?Uuid $id): void - { - $this->id = $id; - } - public function getName(): string { return $this->name; diff --git a/src/Event/AbstractEvent.php b/src/Event/AbstractEvent.php index be3b76e..f04d592 100644 --- a/src/Event/AbstractEvent.php +++ b/src/Event/AbstractEvent.php @@ -7,11 +7,11 @@ class AbstractEvent { public function __construct( - private string $id + private int $id ) { } - public function getId(): string + public function getId(): int { return $this->id; } diff --git a/src/Event/Food/HasBeenRefilled.php b/src/Event/Food/HasBeenRefilled.php index c53b0f3..6fb0542 100644 --- a/src/Event/Food/HasBeenRefilled.php +++ b/src/Event/Food/HasBeenRefilled.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace App\Event\AbstractEvent; +namespace App\Event\Food; use App\Event\AbstractEvent; use App\Event\AsyncLowPriorityEvent; diff --git a/src/EventHandler/Dinosaur/UpsertDinosaurSummary.php b/src/EventHandler/Dinosaur/UpsertDinosaurSummary.php index 3500455..752bf37 100644 --- a/src/EventHandler/Dinosaur/UpsertDinosaurSummary.php +++ b/src/EventHandler/Dinosaur/UpsertDinosaurSummary.php @@ -4,7 +4,7 @@ namespace App\EventHandler\Dinosaur; -use App\Event\AbstractEvent\HasBeenRefilled; +use App\Event\Food\HasBeenRefilled; use App\Event\Dinosaur\HasBeenCreated as DinosaurHasBeenCreated; use App\Event\Dinosaur\HasBeenUpdated as DinosaurHasBeenUpdated; use App\Event\Species\HasBeenUpdated as SpeciesHasBeenUpdated; @@ -38,13 +38,13 @@ public function handleDinosaurHasBeenUpdated(DinosaurHasBeenUpdated $event): voi #[AsMessageHandler] public function handleFoodHasBeenConsumed(HasBeenConsumed $event): void { - $this->updateSummariesByPark((int) $event->getId()); + $this->updateSummariesByPark($event->getId()); } #[AsMessageHandler] public function handleFoodHasBeenRefilled(HasBeenRefilled $event): void { - $this->updateSummariesByPark((int) $event->getId()); + $this->updateSummariesByPark($event->getId()); } #[AsMessageHandler] @@ -52,7 +52,7 @@ public function handleSpeciesHasBeenUpdated(SpeciesHasBeenUpdated $event): void { $speciesId = $event->getId(); - $species = $this ->speciesRepository->find($speciesId); + $species = $this->speciesRepository->find($speciesId); if (null === $species) { throw new \RuntimeException(sprintf( @@ -68,7 +68,7 @@ public function handleSpeciesHasBeenUpdated(SpeciesHasBeenUpdated $event): void } } - private function updateSummaryByDinosaur(string $dinosaurId): void + private function updateSummaryByDinosaur(int $dinosaurId): void { $dinosaur = $this->dinosaurRepository->find($dinosaurId); diff --git a/src/Indexer.php b/src/Indexer.php index f115818..80be302 100644 --- a/src/Indexer.php +++ b/src/Indexer.php @@ -37,7 +37,7 @@ public function indexFromDinosaur(Dinosaur $dinosaur): void ]); } - public function delete(string $id) + public function delete(int $id) { $this->client->delete([ 'index' => self::INDEX_NAME, diff --git a/src/Message/Dinosaur/Create.php b/src/Message/Dinosaur/Create.php index 7190c94..5ccc485 100644 --- a/src/Message/Dinosaur/Create.php +++ b/src/Message/Dinosaur/Create.php @@ -9,7 +9,7 @@ public function __construct( public readonly string $gender, public readonly string $eyesColor, public readonly int $age, - public readonly string $speciesId, + public readonly int $speciesId, public readonly int $parkId, ) { } diff --git a/src/Message/Dinosaur/Delete.php b/src/Message/Dinosaur/Delete.php index 941dfc2..4bbd29d 100644 --- a/src/Message/Dinosaur/Delete.php +++ b/src/Message/Dinosaur/Delete.php @@ -5,7 +5,7 @@ class Delete { public function __construct( - public readonly string $id + public readonly int $id ) { } } diff --git a/src/Message/Dinosaur/Edit.php b/src/Message/Dinosaur/Edit.php index 88e2c9c..5307ed1 100644 --- a/src/Message/Dinosaur/Edit.php +++ b/src/Message/Dinosaur/Edit.php @@ -5,7 +5,7 @@ class Edit { public function __construct( - public readonly string $id, + public readonly int $id, public readonly string $name, public readonly string $gender, public readonly string $eyesColor, diff --git a/src/Message/Food/Consume.php b/src/Message/Food/Consume.php index 8cb8dda..336f2ac 100644 --- a/src/Message/Food/Consume.php +++ b/src/Message/Food/Consume.php @@ -9,7 +9,7 @@ class Consume implements Lockable { public function __construct( - public readonly string $dinosaurId, + public readonly int $dinosaurId, public readonly string $dinosaurName ) { } diff --git a/src/Message/Species/Delete.php b/src/Message/Species/Delete.php index 578beae..b0b40ef 100644 --- a/src/Message/Species/Delete.php +++ b/src/Message/Species/Delete.php @@ -5,7 +5,7 @@ class Delete { public function __construct( - public readonly string $id + public readonly int $id ) { } } diff --git a/src/Message/Species/Edit.php b/src/Message/Species/Edit.php index 5fb840c..911c931 100644 --- a/src/Message/Species/Edit.php +++ b/src/Message/Species/Edit.php @@ -5,7 +5,7 @@ class Edit { public function __construct( - public readonly string $id, + public readonly int $id, public readonly string $name, public readonly string $feeding, public readonly array $habitats diff --git a/src/MessageHandler/Dinosaur/Create.php b/src/MessageHandler/Dinosaur/Create.php index fa1da30..1aa065a 100644 --- a/src/MessageHandler/Dinosaur/Create.php +++ b/src/MessageHandler/Dinosaur/Create.php @@ -45,15 +45,15 @@ public function __invoke(CreateMessage $message) park: $park ); - $this->dinosaurRepository->add($dino); + $this->dinosaurRepository->add($dino, flush: true); - $envelop = new Envelope(new HasBeenCreated($dino->getId()->toRfc4122())); + $envelop = new Envelope(new HasBeenCreated($dino->getId())); $this ->eventBus ->dispatch($envelop->with(new DispatchAfterCurrentBusStamp())) ; - return new CreateMessageResult($dino->getId()->toRfc4122()); + return new CreateMessageResult($dino->getId()); } } diff --git a/src/MessageHandler/Dinosaur/Edit.php b/src/MessageHandler/Dinosaur/Edit.php index aa2862a..64ab1de 100644 --- a/src/MessageHandler/Dinosaur/Edit.php +++ b/src/MessageHandler/Dinosaur/Edit.php @@ -37,7 +37,7 @@ public function __invoke(EditMessage $message) $dinosaur->setAge($message->age); $dinosaur->setSpecies($species); - $envelop = new Envelope(new HasBeenUpdated($dinosaur->getId()->toRfc4122())); + $envelop = new Envelope(new HasBeenUpdated($dinosaur->getId())); $this ->eventBus diff --git a/src/MessageHandler/Food/Consume.php b/src/MessageHandler/Food/Consume.php index 39912d4..560389b 100644 --- a/src/MessageHandler/Food/Consume.php +++ b/src/MessageHandler/Food/Consume.php @@ -31,6 +31,7 @@ public function __invoke(FoodConsume $message) $dinosaursRepository = $this->em->getRepository(Dinosaur::class); + /** @var Dinosaur $dinosaur */ $dinosaur = $dinosaursRepository->find($dinosaurId); $park = $dinosaur->getPark(); @@ -54,7 +55,7 @@ public function __invoke(FoodConsume $message) $park->setFoodAmount($park->getFoodAmount() - $consumedAmout); - $envelop = new Envelope(new HasBeenConsumed((string) $park->getId())); + $envelop = new Envelope(new HasBeenConsumed($park->getId())); $this ->eventBus diff --git a/src/MessageHandler/Food/Refill.php b/src/MessageHandler/Food/Refill.php index d5772a2..e84d4fd 100644 --- a/src/MessageHandler/Food/Refill.php +++ b/src/MessageHandler/Food/Refill.php @@ -31,6 +31,7 @@ public function __invoke(FoodRefill $refill) $parkRepository = $this->entityManager->getRepository(Park::class); + /** @var Park[] $parks */ $parks = $parkRepository->findAll(); $dinosaurIsAttacking = random_int(0, 10); @@ -43,7 +44,7 @@ public function __invoke(FoodRefill $refill) $park->setFoodAmount(100); } - $envelop = new Envelope(new HasBeenRefilled((string) $park->getId())); + $envelop = new Envelope(new HasBeenRefilled($park->getId())); $this ->eventBus diff --git a/src/MessageHandler/Species/Create.php b/src/MessageHandler/Species/Create.php index f4a426b..02c1185 100644 --- a/src/MessageHandler/Species/Create.php +++ b/src/MessageHandler/Species/Create.php @@ -11,7 +11,6 @@ use Symfony\Component\Messenger\Envelope; use Symfony\Component\Messenger\MessageBusInterface; use Symfony\Component\Messenger\Stamp\DispatchAfterCurrentBusStamp; -use Symfony\Component\Uid\Uuid; #[AsMessageHandler] final class Create @@ -30,17 +29,16 @@ public function __invoke(CreateMessage $message): CreateMessageResult feeding: $message->feeding ); - $this->speciesRepository->add($species); + $this->speciesRepository->add($species, flush: true); $envelop = new Envelope(new HasBeenCreated( - $species->getId()->toRfc4122() + $species->getId() )); $this ->eventBus - ->dispatch($envelop->with(new DispatchAfterCurrentBusStamp())) - ; + ->dispatch($envelop->with(new DispatchAfterCurrentBusStamp())); - return new CreateMessageResult($species->getId()->toRfc4122()); + return new CreateMessageResult($species->getId()); } } diff --git a/src/MessageResults/Dinosaur/Create.php b/src/MessageResults/Dinosaur/Create.php index f9b0bc8..9a317e2 100644 --- a/src/MessageResults/Dinosaur/Create.php +++ b/src/MessageResults/Dinosaur/Create.php @@ -7,7 +7,7 @@ class Create { public function __construct( - public readonly string $id, + public readonly int $id, ) { } } diff --git a/src/MessageResults/Species/Create.php b/src/MessageResults/Species/Create.php index 82c8243..e446b2f 100644 --- a/src/MessageResults/Species/Create.php +++ b/src/MessageResults/Species/Create.php @@ -7,7 +7,7 @@ class Create { public function __construct( - public readonly string $id, + public readonly int $id, ) { } } diff --git a/src/Repository/DinosaurRepository.php b/src/Repository/DinosaurRepository.php index b60f6c2..d902df2 100644 --- a/src/Repository/DinosaurRepository.php +++ b/src/Repository/DinosaurRepository.php @@ -13,9 +13,12 @@ public function __construct(ManagerRegistry $registry) parent::__construct($registry, Dinosaur::class); } - public function add(Dinosaur $dinosaur): void + public function add(Dinosaur $dinosaur, bool $flush = false): void { $this->getEntityManager()->persist($dinosaur); + if ($flush) { + $this->getEntityManager()->flush(); + } } public function search(?string $q): array diff --git a/src/Repository/SpeciesRepository.php b/src/Repository/SpeciesRepository.php index 998deb9..efeacfb 100644 --- a/src/Repository/SpeciesRepository.php +++ b/src/Repository/SpeciesRepository.php @@ -13,8 +13,11 @@ public function __construct(ManagerRegistry $registry) parent::__construct($registry, Species::class); } - public function add(Species $species): void + public function add(Species $species, bool $flush = false): void { $this->getEntityManager()->persist($species); + if ($flush) { + $this->getEntityManager()->flush(); + } } } diff --git a/src/Stamp/LockStamp.php b/src/Stamp/LockStamp.php index 26aee5e..587381d 100644 --- a/src/Stamp/LockStamp.php +++ b/src/Stamp/LockStamp.php @@ -7,7 +7,7 @@ class LockStamp implements StampInterface { public function __construct( - public readonly string $lockKey + public readonly int $lockKey ) { } } diff --git a/symfony.lock b/symfony.lock index 028c7e9..56022d4 100644 --- a/symfony.lock +++ b/symfony.lock @@ -104,6 +104,18 @@ "phar-io/version": { "version": "3.1.0" }, + "php-http/discovery": { + "version": "1.19", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "main", + "version": "1.18", + "ref": "f45b5dd173a27873ab19f5e3180b2f661c21de02" + }, + "files": [ + "config/packages/http_discovery.yaml" + ] + }, "phpdocumentor/reflection-common": { "version": "2.2.0" },