Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to change Doctrine ORM default tracking policy to Deferred Explicit

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

like image 524
Wax Cage Avatar asked Oct 21 '25 10:10

Wax Cage


1 Answers

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.

  • Events: Lifecycle Events
  • Events: Load ClassMetadata Event
  • Symfony: How to Register Event Listeners and Subscribers

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.

like image 154
Filip Procházka Avatar answered Oct 23 '25 00:10

Filip Procházka



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!