I am using Doctrine ORM with symfony for my latest project. I need my doctrine to use Deferred Explicit tracking policy by default - I need to control what and when to save.
I can change doctrine tracking policy for each entity in its annotations
/**
* @ORM\ChangeTrackingPolicy("DEFERRED_EXPLICIT")
*/
but I would like to make this tracking policy default for all entities. I don't want to create a common parent entity just because of this. Is there any way to set this tracking policy default for a whole project?
About doctrine tracking policies.
Tanks for your time
There is a Doctrine\ORM\Events::loadClassMetadata
event, that you can hook into and create a listener that overwrites the policy in entity metadata.
The listener is called after metadata are loaded from annotations/yml/xml, before they're saved in cache, so it should be very effective.
Here's some working code:
class DoctrineTrackingPolicySubscriber implements EventSubscriber
{
public function getSubscribedEvents()
{
return [
Events::loadClassMetadata
];
}
public function loadClassMetadata(LoadClassMetadataEventArgs $args)
{
$classMetadata = $args->getClassMetadata();
$classMetadata->setChangeTrackingPolicy(
ClassMetadataInfo::CHANGETRACKING_DEFERRED_EXPLICIT
);
}
}
Then in services.yaml
or services.yml
:
App\EventSubscriber\DoctrineTrackingPolicySubscriber:
tags:
- { name: doctrine.event_subscriber, connection: default }
For Symfony versions < 3.3 specifying a class
will be necessary, newer versions implicitly assume service name is FQCN.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With