From d0ce82ac2afb8ba685b200276e5eab84d94c4ced Mon Sep 17 00:00:00 2001 From: Tim Nagel Date: Sun, 21 Sep 2014 20:05:35 +1000 Subject: [PATCH 1/2] Adjust DoctrineListener to remove unnecessary method getDoctrineObject --- CHANGELOG-3.1.md | 14 ++++++++++ Doctrine/Listener.php | 60 ++++++++++++++++++++++++------------------- 2 files changed, 47 insertions(+), 27 deletions(-) create mode 100644 CHANGELOG-3.1.md diff --git a/CHANGELOG-3.1.md b/CHANGELOG-3.1.md new file mode 100644 index 0000000..0170373 --- /dev/null +++ b/CHANGELOG-3.1.md @@ -0,0 +1,14 @@ +CHANGELOG for 3.0.x +=================== + +This changelog references the relevant changes (bug and security fixes) done +in 3.1 versions. + +To get the diff for a specific change, go to +https://github.com/FriendsOfSymfony/FOSElasticaBundle/commit/XXX where XXX is +the commit hash. To get the diff between two versions, go to +https://github.com/FriendsOfSymfony/FOSElasticaBundle/compare/v3.0.4...v3.1.0 + +* 3.1.0 + +* BC BREAK: `DoctrineListener#scheduleForDeletion` access changed to private. diff --git a/Doctrine/Listener.php b/Doctrine/Listener.php index bd8b2c0..039ddaa 100644 --- a/Doctrine/Listener.php +++ b/Doctrine/Listener.php @@ -2,8 +2,8 @@ namespace FOS\ElasticaBundle\Doctrine; -use Doctrine\Common\EventArgs; use Doctrine\Common\EventSubscriber; +use Doctrine\Common\Persistence\Event\LifecycleEventArgs; use FOS\ElasticaBundle\Persister\ObjectPersisterInterface; use FOS\ElasticaBundle\Persister\ObjectPersister; use FOS\ElasticaBundle\Provider\IndexableInterface; @@ -38,13 +38,23 @@ class Listener implements EventSubscriber private $config; /** - * Objects scheduled for insertion and replacement + * Objects scheduled for insertion. + * + * @var array */ public $scheduledForInsertion = array(); + + /** + * Objects scheduled to be updated or removed. + * + * @var array + */ public $scheduledForUpdate = array(); /** * IDs of objects scheduled for removal + * + * @var array */ public $scheduledForDeletion = array(); @@ -56,7 +66,7 @@ class Listener implements EventSubscriber protected $propertyAccessor; /** - * @var \FOS\ElasticaBundle\Provider\IndexableInterface + * @var IndexableInterface */ private $indexable; @@ -98,37 +108,27 @@ class Listener implements EventSubscriber } /** - * Provides unified method for retrieving a doctrine object from an EventArgs instance + * Looks for new objects that should be indexed. * - * @param EventArgs $eventArgs - * @return object Entity | Document - * @throws \RuntimeException if no valid getter is found. + * @param LifecycleEventArgs $eventArgs */ - private function getDoctrineObject(EventArgs $eventArgs) + public function postPersist(LifecycleEventArgs $eventArgs) { - if (method_exists($eventArgs, 'getObject')) { - return $eventArgs->getObject(); - } elseif (method_exists($eventArgs, 'getEntity')) { - return $eventArgs->getEntity(); - } elseif (method_exists($eventArgs, 'getDocument')) { - return $eventArgs->getDocument(); - } - - throw new \RuntimeException('Unable to retrieve object from EventArgs.'); - } - - public function postPersist(EventArgs $eventArgs) - { - $entity = $this->getDoctrineObject($eventArgs); + $entity = $eventArgs->getObject(); if ($this->objectPersister->handlesObject($entity) && $this->isObjectIndexable($entity)) { $this->scheduledForInsertion[] = $entity; } } - public function postUpdate(EventArgs $eventArgs) + /** + * Looks for objects being updated that should be indexed or removed from the index. + * + * @param LifecycleEventArgs $eventArgs + */ + public function postUpdate(LifecycleEventArgs $eventArgs) { - $entity = $this->getDoctrineObject($eventArgs); + $entity = $eventArgs->getObject(); if ($this->objectPersister->handlesObject($entity)) { if ($this->isObjectIndexable($entity)) { @@ -143,10 +143,12 @@ class Listener implements EventSubscriber /** * Delete objects preRemove instead of postRemove so that we have access to the id. Because this is called * preRemove, first check that the entity is managed by Doctrine + * + * @param LifecycleEventArgs $eventArgs */ - public function preRemove(EventArgs $eventArgs) + public function preRemove(LifecycleEventArgs $eventArgs) { - $entity = $this->getDoctrineObject($eventArgs); + $entity = $eventArgs->getObject(); if ($this->objectPersister->handlesObject($entity)) { $this->scheduleForDeletion($entity); @@ -179,6 +181,10 @@ class Listener implements EventSubscriber * data in the event of a crash during flush. * * This method is only called in legacy configurations of the listener. + * + * @deprecated This method should only be called in applications that depend + * on the behaviour that entities are indexed regardless of if a + * flush is successful. */ public function preFlush() { @@ -199,7 +205,7 @@ class Listener implements EventSubscriber * * @param object $object */ - protected function scheduleForDeletion($object) + private function scheduleForDeletion($object) { if ($identifierValue = $this->propertyAccessor->getValue($object, $this->config['identifier'])) { $this->scheduledForDeletion[] = $identifierValue; From 71a86cada54ebc94d5723808b0616c7e378a3a27 Mon Sep 17 00:00:00 2001 From: Tim Nagel Date: Sun, 21 Sep 2014 20:06:06 +1000 Subject: [PATCH 2/2] BC BREAK: Add `handlesObject` method to ObjectPersisterInterface --- CHANGELOG-3.1.md | 2 ++ Persister/ObjectPersisterInterface.php | 8 ++++++++ 2 files changed, 10 insertions(+) diff --git a/CHANGELOG-3.1.md b/CHANGELOG-3.1.md index 0170373..ee9af70 100644 --- a/CHANGELOG-3.1.md +++ b/CHANGELOG-3.1.md @@ -12,3 +12,5 @@ https://github.com/FriendsOfSymfony/FOSElasticaBundle/compare/v3.0.4...v3.1.0 * 3.1.0 * BC BREAK: `DoctrineListener#scheduleForDeletion` access changed to private. +* BC BREAK: `ObjectPersisterInterface` gains the method `handlesObject` that + returns a boolean value if it will handle a given object or not. diff --git a/Persister/ObjectPersisterInterface.php b/Persister/ObjectPersisterInterface.php index 2b4c8ee..0df7f7e 100644 --- a/Persister/ObjectPersisterInterface.php +++ b/Persister/ObjectPersisterInterface.php @@ -68,4 +68,12 @@ interface ObjectPersisterInterface * @param array $identifiers array of domain model object identifiers */ public function deleteManyByIdentifiers(array $identifiers); + + /** + * If the object persister handles the given object. + * + * @param object $object + * @return bool + */ + public function handlesObject($object); }