Download the PHP package bentools/doctrine-safe-events without Composer
On this page you can find all versions of the php package bentools/doctrine-safe-events. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.
Download bentools/doctrine-safe-events
More information about bentools/doctrine-safe-events
Files in bentools/doctrine-safe-events
Package doctrine-safe-events
Short Description Fires postPersist / postUpdate / postRemove events AFTER the transaction has completed.
License MIT
Informations about the package doctrine-safe-events
Doctrine safe post* events
Doctrine's postPersist, postUpdate and postRemove events are fired when the corresponding SQL queries (INSERT / UPDATE / DELETE) have been performed against the database server.
What happens under the hood is that Doctrine creates a wrapping transaction, runs SQL queries, then commits the transaction.
However, these events are fired immediately, e.g. not once the transaction is complete, which means:
- If the wrapping transaction fails, events have already been fired anyway (meaning you trusted generated primary key values, although they're going to be rolled back)
- If the wrapping transaction takes some time (typically during row locks), you get the inserted / updated / deleted information before it's actually done (meaning if you run some async process once those events are triggered, you end up in processing not data which is not up-to-date)
Background
The idea of this repository indeed came up with the following issue:
- An entity is persisted, then
$em->flush()
is called - A
postPersist
event listener gets the entity's id, then asks a worker to do some async processing through Symfony Messenger - The worker queries database against the entity's id, and gets an
EntityNotFound
exception (theCOMMIT
did not happen yet) - The flush operation on the main thread completes, and the
postFlush
event is fired (but it does not contain the inserted / updated / deleted entities)
Our solution
If you run into the same kind of issues, you can replace your listeners' listened events in favor of:
Bentools\DoctrineSafeEvents\SafeEvents::POST_PERSIST
(and implementsafePostPersist
as a replacement ofpostPersist
)Bentools\DoctrineSafeEvents\SafeEvents::POST_UPDATE
(and implementsafePostUpdate
as a replacement ofpostUpdate
)Bentools\DoctrineSafeEvents\SafeEvents::POST_REMOVE
(and implementsafePostRemove
as a replacement ofpostRemove
)
Basically, this library will collect entities which are scheduled for insertion / update / deletion, except it will delay event firing until the postFlush
occurs.
Installation
Usage in Symfony
Although this library has no dependency on Symfony, you can easily use it in your Symfony project:
Example usage
Tests
License
MIT.