diff --git a/library/Hydrator/Strategy/HasOneStrategy.php b/library/Hydrator/Strategy/HasOneStrategy.php index 613f9ed..63a293f 100644 --- a/library/Hydrator/Strategy/HasOneStrategy.php +++ b/library/Hydrator/Strategy/HasOneStrategy.php @@ -62,19 +62,17 @@ public function extract($value) return $this->nullable ? null : []; } + if (is_object($value)) { + $objectPrototype = $this->getObjectPrototype(); + return $objectPrototype->getHydrator()->extract($value); + } + if (is_array($value)) { return $value; } - $objectPrototype = $this->getObjectPrototype(); - - if ($value instanceof $objectPrototype) { - return $objectPrototype->getHydrator()->extract($value); - } - throw new Exception\InvalidArgumentException(sprintf( - 'Invalid value: must be null (only if nullable option is enabled), or an array, or an instance of "%s": "%s" given', - get_class($objectPrototype), + 'Invalid value: must be null, or an array, or an object: "%s" given', is_object($value) ? get_class($value) : gettype($value) )); } diff --git a/library/Object/AbstractCollection.php b/library/Object/AbstractCollection.php index 5aa58eb..da2ee98 100644 --- a/library/Object/AbstractCollection.php +++ b/library/Object/AbstractCollection.php @@ -103,26 +103,18 @@ public function append($value) * @return array * @throws Exception\InvalidArgumentException */ + /** + * {@inheritdoc} + */ public function exchangeArray($data) { - if (!is_array($data) && !is_object($data)) { - throw new Exception\InvalidArgumentException( - 'Passed variable is not an array or object, using empty array instead' - ); - } - - if (is_object($data) && ($data instanceof parent || $data instanceof \ArrayObject)) { - $data = $data->getArrayCopy(); + $oldData = parent::exchangeArray($data); + try { + $this->validateData($this->storage); + } catch (\Exception $e) { + $this->storage = $oldData; + throw $e; } - - if (!is_array($data)) { - $data = (array) $data; - } - - $this->validateData($data); - - $storage = $this->storage; - $this->storage = $data; - return $storage; + return $oldData; } } diff --git a/tests/Object/AbstractCollectionTest.php b/tests/Object/AbstractCollectionTest.php index f2eae18..2428c63 100644 --- a/tests/Object/AbstractCollectionTest.php +++ b/tests/Object/AbstractCollectionTest.php @@ -97,8 +97,15 @@ public function testExchangeArrayArrayIterator() } public function testExchangeArrayStringArgumentFail() { + $data = ['foo' => 'bar']; $this->setExpectedException('InvalidArgumentException'); - $ar = $this->getMockForAbstractClass(AbstractCollection::class, [['foo' => 'bar']]); - $old = $ar->exchangeArray('Bacon'); + $ar = $this->getMockForAbstractClass(AbstractCollection::class, [$data]); + try { + $old = $ar->exchangeArray('Bacon'); + } catch (\Exception $e) { + // Test data did not change + $this->assertEquals($data, $ar->getArrayCopy()); + throw $e; + } } }