diff --git a/docs/pages/docs/features/database/doctrine/console.md b/docs/pages/docs/features/database/doctrine/console.md index 772ee1b8a87a6d66e8b49e0b15c85a7dac949858..fb7d9d9fb35f07db9bcb9e3e7a8ae3732c60073b 100644 --- a/docs/pages/docs/features/database/doctrine/console.md +++ b/docs/pages/docs/features/database/doctrine/console.md @@ -1,6 +1,7 @@ --- collections: - - documents + - name: documents + next: docs/features/database/doctrine/entities layout: dm:document next: docs/features/database/doctrine/entities parent: docs/features/database/doctrine/index diff --git a/docs/pages/docs/features/database/doctrine/entities.md b/docs/pages/docs/features/database/doctrine/entities.md index 0b23ce6661e14c8c73b20f8188d73213642ed424..d927fb5e8ef313fa0135730adabd097473b220ad 100644 --- a/docs/pages/docs/features/database/doctrine/entities.md +++ b/docs/pages/docs/features/database/doctrine/entities.md @@ -1,6 +1,7 @@ --- collections: - - documents + - name: documents + next: docs/features/database/doctrine/entity-managers layout: dm:document next: docs/features/database/doctrine/entity-managers parent: docs/features/database/doctrine/index diff --git a/docs/pages/docs/features/database/doctrine/entity-managers.md b/docs/pages/docs/features/database/doctrine/entity-managers.md index 899da03a9b2bfc4762c197ee99308af9f4d04bad..4e2ea6ce5de740c85ea494b8ef8883e5a1c81ed2 100644 --- a/docs/pages/docs/features/database/doctrine/entity-managers.md +++ b/docs/pages/docs/features/database/doctrine/entity-managers.md @@ -1,7 +1,9 @@ --- collections: - - documents + - name: documents + next: docs/features/database/doctrine/events layout: dm:document +next: docs/features/database/doctrine/events parent: docs/features/database/doctrine/index title: Entity Managers description: > diff --git a/docs/pages/docs/features/database/doctrine/events.md b/docs/pages/docs/features/database/doctrine/events.md new file mode 100644 index 0000000000000000000000000000000000000000..722adf2bbbe5254af4f3e19dff9afaf4bf211de6 --- /dev/null +++ b/docs/pages/docs/features/database/doctrine/events.md @@ -0,0 +1,87 @@ +--- +collections: + - documents +layout: dm:document +parent: docs/features/database/doctrine/index +title: Events +description: > + Learn how to hook into Doctrine's event system. +--- + +# Events + +You can hook into Doctrine's lifecycle events, including global events and +events specific to a particular entity. + +# Usage + +## Global Doctrine Events + +Needs `ListensToDoctrineEvents` attribute. For example: + +```php +<?php + +namespace App\DoctrineEventSubscriber; + +use Distantmagic\Resonance\Attribute\ListensToDoctrineEvents; +use Distantmagic\Resonance\Attribute\Singleton; +use Distantmagic\Resonance\DoctrineEventSubscriber; +use Distantmagic\Resonance\SingletonCollection; +use Doctrine\ORM\Event\LoadClassMetadataEventArgs; +use Doctrine\ORM\Events; + +#[ListensToDoctrineEvents] +#[Singleton(collection: SingletonCollection::DoctrineEventListener)] +readonly class AugumentClassMetadata extends DoctrineEventSubscriber +{ + public function getSubscribedEvents() + { + return [ + Events::loadClassMetadata, + ]; + } + + public function loadClassMetadata(LoadClassMetadataEventArgs $args): void + { + // augument class metada with something... + } +} +``` + +## Entity Listeners + +Resonance provides `ListensToDoctrineEntityEvents` attribute that binds the +listener to the doctrine entity. + +Such a class has to be a singleton, added to the `DoctrineEntityListener` +collection. + +After marking a class with the above attribute, you can add it's methods +in a way that is described in +[Doctrine's documentation](https://www.doctrine-project.org/projects/doctrine-orm/en/3.0/reference/events.html#entity-listeners-class). + +```php +<?php + +declare(strict_types=1); + +namespace App\DoctrineEntityListener; + +use App\DoctrineEntity\MyEntity; +use Distantmagic\Resonance\Attribute\ListensToDoctrineEntityEvents; +use Distantmagic\Resonance\Attribute\Singleton; +use Distantmagic\Resonance\DoctrineEntityListener; +use Distantmagic\Resonance\Environment; +use Distantmagic\Resonance\SingletonCollection; + +#[ListensToDoctrineEntityEvents(MyEntity::class)] +#[Singleton(collection: SingletonCollection::DoctrineEntityListener)] +readonly class SendNewsletterDoubleOptinMail extends DoctrineEntityListener +{ + public function postPersist(MyEntity $myEntity): void + { + // do something with $myEntity... + } +} +```