diff --git a/src/Handler/EntityHandler.php b/src/Handler/EntityHandler.php index a80d51f..f43ea6a 100644 --- a/src/Handler/EntityHandler.php +++ b/src/Handler/EntityHandler.php @@ -174,6 +174,10 @@ protected function refreshDomainProperty( } // refresh the underlying domain object - $this->handlerLocator->get($datum)->refreshDomain($datum, $refresh); + $handler = $this->handlerLocator->get($datum); + if (!$handler instanceof MappedHandler) { + return; + } + $handler->refreshDomain($datum, $refresh); } } diff --git a/src/Handler/HandlerLocator.php b/src/Handler/HandlerLocator.php index 2aa9ce6..9a9e206 100644 --- a/src/Handler/HandlerLocator.php +++ b/src/Handler/HandlerLocator.php @@ -8,6 +8,8 @@ class HandlerLocator { + private $atlas; + protected $instances = []; protected $storage; diff --git a/src/Reflection/ParametersTrait.php b/src/Reflection/ParametersTrait.php index a6af72b..cfe767f 100644 --- a/src/Reflection/ParametersTrait.php +++ b/src/Reflection/ParametersTrait.php @@ -3,7 +3,6 @@ namespace Atlas\Transit\Reflection; -use Atlas\Transit\Inflector\Inflector; use ReflectionClass; trait ParametersTrait @@ -57,13 +56,14 @@ protected function setParameters( $this->types[$name] = null; $this->classes[$name] = null; - $class = $rparam->getClass(); + $type = $rparam->getType(); + $class = null !== $type && !$type->isBuiltin() ? $type->getName() : null; + if ($class !== null) { - $this->classes[$name] = $class->getName(); + $this->classes[$name] = $class; continue; } - $type = $rparam->getType(); if ($type === null) { continue; } diff --git a/src/Transit.php b/src/Transit.php index f3d163a..25c8070 100644 --- a/src/Transit.php +++ b/src/Transit.php @@ -93,11 +93,19 @@ public function persist() : void foreach ($this->plan as $domain) { $handler = $this->handlerLocator->get($domain); $method = $this->plan->getInfo(); - $source = $handler->$method($domain, $refresh); - if ($source instanceof RecordSet) { - $this->atlas->persistRecordSet($source); - } else { - $this->atlas->persist($source); + if (null === $method) { + continue; + } + try { + $source = $handler->$method($domain, $refresh); + if ($source instanceof RecordSet) { + $this->atlas->persistRecordSet($source); + } else { + $this->atlas->persist($source); + } + } catch (\Exception $exception) { + $this->plan->setInfo(null); + throw $exception; } } diff --git a/tests/ValueObjectTest.php b/tests/ValueObjectTest.php index 6b45d49..6b77d6f 100644 --- a/tests/ValueObjectTest.php +++ b/tests/ValueObjectTest.php @@ -33,15 +33,15 @@ public function test() // fake a record from the database $fakeRecord = new FakeRecord( new FakeRow([ - 'fake_id' => '1', - 'email_address' => 'fake@example.com', - 'date_time' => '1970-08-08', - 'json_blob' => json_encode(['foo' => 'bar', 'baz' => 'dib']), - 'address_street' => '123 Main', - 'address_city' => 'Beverly Hills', - 'address_state' => 'CA', - 'address_zip' => '90210' - ]), + 'fake_id' => '1', + 'email_address' => 'fake@example.com', + 'date_time' => '1970-08-08', + 'json_blob' => json_encode(['foo' => 'bar', 'baz' => 'dib']), + 'address_street' => '123 Main', + 'address_city' => 'Beverly Hills', + 'address_state' => 'CA', + 'address_zip' => '90210', + ]), new Related([]) ); @@ -62,20 +62,20 @@ public function test() 'emailAddress' => [ 'address' => 'fake@example.com', ], - 'dateTime' => [ + 'dateTime' => [ 'date' => '1970-08-08', 'time' => '00:00:00', ], - 'jsonBlob' => [ - 'foo' => 'bar', - 'baz' => 'dib', + 'jsonBlob' => [ + 'foo' => 'bar', + 'baz' => 'dib', ], - 'fakeId' => 1, - 'address' => [ + 'fakeId' => 1, + 'address' => [ 'street' => '123 Main', - 'city' => 'Beverly Hills', - 'state' => 'CA', - 'zip' => '90210', + 'city' => 'Beverly Hills', + 'state' => 'CA', + 'zip' => '90210', ], ]; @@ -101,16 +101,48 @@ public function test() $this->transit->persist(); $expect = [ - 'fake_id' => 1, - 'email_address' => 'fake_changed@example.com', - 'date_time' => '1970-08-08 00:00:00', - 'json_blob' => '{"foo":"bar","baz":"dib"}', + 'fake_id' => 1, + 'email_address' => 'fake_changed@example.com', + 'date_time' => '1970-08-08 00:00:00', + 'json_blob' => '{"foo":"bar","baz":"dib"}', 'address_street' => '456 Central', - 'address_city' => 'Bel Air', - 'address_state' => '90007', - 'address_zip' => 'CA', + 'address_city' => 'Bel Air', + 'address_state' => '90007', + 'address_zip' => 'CA', ]; $actual = $fakeRecord->getArrayCopy(); $this->assertEquals($expect, $actual); } + + public function testNewEntity() + { + // Create new entity + $newFakeEntity = new Fake($email = new Email('fake@example.com'), + $address = new Address('456 Central', + 'Bel Air', + 'CA', + '90007'), + $dateTime = new DateTime('now'), + $bag = new Bag([])); + + // Store and persist data + $this->transit->store($newFakeEntity); + $this->transit->persist(); + + $newFakeRecord = $this->transit->getStorage()->offsetGet($newFakeEntity); + + $expect = [ + 'fake_id' => null, + 'email_address' => 'fake@example.com', + 'date_time' => $dateTime->format('Y-m-d H:i:s'), + 'json_blob' => '[]', + 'address_street' => '456 Central', + 'address_city' => 'Bel Air', + 'address_state' => 'CA', + 'address_zip' => '90007', + ]; + $actual = $newFakeRecord->getArrayCopy(); + + $this->assertEquals($expect, $actual); + } }