/** * @dataProvider entityManagerDataProvider * @param EntityManager $em */ public function testIntercepts(EntityManager $em) { $em->getDispatcher()->addListener(Event::PRE_RETRIEVE, function (RetrieveEvent $event) { // Return something completely different instead $event->setReturnValue(new Article()); $event->setAbort(true); }); $em->getDispatcher()->addListener(Event::POST_PERSIST, function (PersistEvent $event) { /** @var Product $entity */ $entity = $event->getEntity(); $this->assertTrue($entity instanceof Product); $entity->setName('Persisted Product'); }); $product = new Product(); $product->setId(111)->setName('New Product')->setCreateTime(new \DateTime()); $em->persist($product); $em->flush(); $this->assertEquals('Persisted Product', $product->getName()); $retrieved = $em->retrieve(Product::class, 111); $this->assertTrue($retrieved instanceof Article); }