Skip to content

Commit 83ef4fb

Browse files
committed
Implementação do insertPerformer, ainda faltam os performes de update e delete.
1 parent 76fb957 commit 83ef4fb

File tree

7 files changed

+255
-8
lines changed

7 files changed

+255
-8
lines changed

src/Db/Gateway/DynamicTableGateway.php

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use Zend\Db\TableGateway\TableGateway;
88
use Zend\EntityMapper\Config\Container\Container;
99
use Zend\EntityMapper\Db\Sql\Factory\Select\SelectFactory;
10+
use Zend\EntityMapper\Db\Sql\Performer\InsertPerformer;
1011
use Zend\EntityMapper\Db\Sql\Performer\SelectPerformer;
1112

1213
/**
@@ -89,4 +90,21 @@ public function select(string $entity, $select)
8990

9091
return $rows;
9192
}
93+
94+
/**
95+
* @param $object
96+
* @return mixed
97+
* @throws \Zend\Cache\Exception\ExceptionInterface
98+
* @throws \Zend\EntityMapper\Config\Container\Exceptions\ItemNotFoundException
99+
*/
100+
public function insert($object)
101+
{
102+
$entity = get_class($object);
103+
$this->setUp($entity);
104+
105+
$insertPerformer = new InsertPerformer(self::$tableGateways[$entity]);
106+
$object = $insertPerformer->perform($object);
107+
108+
return $object;
109+
}
92110
}

src/Db/Sql/Performer/Base/AbstractPerformer.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace Zend\EntityMapper\Db\Sql\Performer\Base;
44

5+
use Zend\Db\TableGateway\TableGateway;
56
use Zend\Db\TableGateway\TableGatewayInterface;
67

78
/**
@@ -12,7 +13,7 @@
1213
abstract class AbstractPerformer implements PerformerInterface
1314
{
1415
/**
15-
* @var TableGatewayInterface
16+
* @var TableGateway
1617
*/
1718
protected $tableGateway;
1819

src/Db/Sql/Performer/Base/PerformerInterface.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ interface PerformerInterface
1717
public function getTableGateway(): TableGatewayInterface;
1818

1919
/**
20-
* @param $select
20+
* @param $command
2121
*/
22-
public function perform($select);
22+
public function perform($command);
2323
}
Lines changed: 42 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,44 @@
11
<?php
2+
3+
namespace Zend\EntityMapper\Db\Sql\Performer;
4+
5+
use Zend\Db\TableGateway\TableGateway;
6+
use Zend\EntityMapper\Db\Sql\Performer\Base\AbstractPerformer;
7+
use Zend\EntityMapper\Mapping\Extraction\Extractor;
8+
use Zend\EntityMapper\Mapping\Hydration\Hydrator;
9+
210
/**
3-
* Created by PhpStorm.
4-
* User: Lucas A. de Araújo
5-
* Date: 13/07/2018
6-
* Time: 09:20
7-
*/
11+
* InsertPerformer
12+
*
13+
* @package Zend\EntityMapper\Db\Sql\Performer
14+
*/
15+
class InsertPerformer extends AbstractPerformer
16+
{
17+
/**
18+
* InsertPerformer constructor.
19+
* @param TableGateway $tableGateway
20+
*/
21+
public function __construct(TableGateway $tableGateway)
22+
{
23+
$this->tableGateway = $tableGateway;
24+
}
25+
26+
/**
27+
* @param $object
28+
* @throws \Zend\Cache\Exception\ExceptionInterface
29+
* @throws \Zend\EntityMapper\Config\Container\Exceptions\ItemNotFoundException
30+
*/
31+
public function perform($object)
32+
{
33+
$extractor = new Extractor();
34+
$array = $extractor->extract($object);
35+
36+
$this->tableGateway->insert($array);
37+
$lastInsertValue = $this->tableGateway->getLastInsertValue();
38+
39+
$hydrator = new Hydrator();
40+
$hydrator->hydratePrimaryKey($lastInsertValue, $object);
41+
42+
return $object;
43+
}
44+
}
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
<?php
2+
3+
namespace Zend\EntityMapper\Mapping\Extraction;
4+
5+
use Zend\EntityMapper\Config\Container\Container;
6+
use Zend\EntityMapper\Config\Entity;
7+
use Zend\EntityMapper\Config\Field;
8+
9+
/**
10+
* Extractor
11+
*
12+
* @package Zend\EntityMapper\Mapping\Extraction
13+
*/
14+
class Extractor
15+
{
16+
/**
17+
* @param $object
18+
* @return Entity
19+
* @throws \Zend\Cache\Exception\ExceptionInterface
20+
* @throws \Zend\EntityMapper\Config\Container\Exceptions\ItemNotFoundException
21+
*/
22+
private function getConfiguration($object): Entity
23+
{
24+
$container = new Container();
25+
$type = get_class($object);
26+
$configuration = $container->get($type);
27+
28+
return $configuration;
29+
}
30+
31+
/**
32+
* @param $object
33+
* @return Field[]
34+
* @throws \Zend\Cache\Exception\ExceptionInterface
35+
* @throws \Zend\EntityMapper\Config\Container\Exceptions\ItemNotFoundException
36+
*/
37+
private function getFields($object): array
38+
{
39+
$configuration = $this->getConfiguration($object);
40+
return $configuration->getFields();
41+
}
42+
43+
/**
44+
* @param $object
45+
* @return array
46+
* @throws \Zend\Cache\Exception\ExceptionInterface
47+
* @throws \Zend\EntityMapper\Config\Container\Exceptions\ItemNotFoundException
48+
*/
49+
public function extract($object): array
50+
{
51+
$fields = $this->getFields($object);
52+
$reflection = new \ReflectionObject($object);
53+
$array = [];
54+
55+
foreach ($fields as $field) {
56+
if(!$field->isForeignKey() && !$field->isCollection()){
57+
$array[$field->getAlias()] = $reflection->getProperty($field->getProperty())->getValue($object);
58+
}
59+
}
60+
61+
return $array;
62+
}
63+
}

src/Mapping/Hydration/Hydrator.php

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,32 @@
1414
*/
1515
class Hydrator implements HydratorInterface
1616
{
17+
/**
18+
* @param $value
19+
* @param $object
20+
* @return mixed
21+
* @throws \Zend\Cache\Exception\ExceptionInterface
22+
* @throws \Zend\EntityMapper\Config\Container\Exceptions\ItemNotFoundException
23+
*/
24+
public function hydratePrimaryKey($value, $object)
25+
{
26+
$container = new Container();
27+
$reflection = new \ReflectionObject($object);
28+
29+
/** @var Entity $config */
30+
$config = $container->get(get_class($object));
31+
32+
foreach ($config->getFields() as $field) {
33+
if($field->isPrimaryKey()) {
34+
$property = $reflection->getProperty($field->getProperty());
35+
$property->setAccessible(true);
36+
$property->setValue($object, $value);
37+
}
38+
}
39+
40+
return $object;
41+
}
42+
1743
/**
1844
* @param array $data
1945
* @param object $object

tests/Db/Gateway/DynamicTableGatewayTest.php

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,11 @@
55
use PHPUnit\Framework\MockObject\MockBuilder;
66
use PHPUnit\Framework\TestCase;
77
use Tests\Mapping\Hydration\Car;
8+
use Tests\Mapping\Hydration\Engine;
89
use Zend\Db\Adapter\Adapter;
910
use Zend\Db\Adapter\Driver\DriverInterface;
11+
use Zend\Db\Adapter\Driver\Mysqli\Connection;
12+
use Zend\Db\Adapter\Driver\Mysqli\Result;
1013
use Zend\Db\Adapter\ParameterContainer;
1114
use Zend\Db\Adapter\StatementContainerInterface;
1215
use Zend\Db\Sql\Select;
@@ -65,6 +68,7 @@ public function execute()
6568
}
6669
}
6770

71+
6872
/**
6973
* DynamicTableGatewayTest
7074
*
@@ -102,4 +106,102 @@ public function testSelect()
102106

103107
$this->assertNotNull($select);
104108
}
109+
110+
/**
111+
* @throws \Zend\Cache\Exception\ExceptionInterface
112+
* @throws \Zend\EntityMapper\Config\Container\Exceptions\ItemNotFoundException
113+
*/
114+
public function testInsert()
115+
{
116+
$lastInsertId = 19950405;
117+
118+
$connection = (new MockBuilder($this, Connection::class))->getMock();
119+
$connection->method('getLastGeneratedValue')->willReturn($lastInsertId);
120+
121+
$result = (new MockBuilder($this, Result::class))->getMock();
122+
$result->method('getAffectedRows')->willReturn(1);
123+
124+
$statementContainer = (new MockBuilder($this, StatementContainer::class))->getMock();
125+
$statementContainer->method('execute')->willReturn($result);
126+
127+
$driver = (new MockBuilder($this, DriverInterface::class))->disableOriginalConstructor()->getMock();
128+
$driver->method('createStatement')->willReturn($statementContainer);
129+
$driver->method('getConnection')->willReturn($connection);
130+
131+
$adapter = new Adapter($driver);
132+
133+
$engine = new Engine();
134+
$engine->cm3 = 3;
135+
$engine->pistons = 6;
136+
$engine->horsepower = 300;
137+
138+
$dynamicTableGateway = new DynamicTableGateway($adapter);
139+
$dynamicTableGateway->insert($engine);
140+
141+
$this->assertEquals($lastInsertId, $engine->id);
142+
}
143+
144+
/**
145+
* @throws \Zend\Cache\Exception\ExceptionInterface
146+
*/
147+
public function testUpdate()
148+
{
149+
$lastInsertId = 19950405;
150+
151+
$connection = (new MockBuilder($this, Connection::class))->getMock();
152+
$connection->method('getLastGeneratedValue')->willReturn($lastInsertId);
153+
154+
$result = (new MockBuilder($this, Result::class))->getMock();
155+
$result->method('getAffectedRows')->willReturn(1);
156+
157+
$statementContainer = (new MockBuilder($this, StatementContainer::class))->getMock();
158+
$statementContainer->method('execute')->willReturn($result);
159+
160+
$driver = (new MockBuilder($this, DriverInterface::class))->disableOriginalConstructor()->getMock();
161+
$driver->method('createStatement')->willReturn($statementContainer);
162+
$driver->method('getConnection')->willReturn($connection);
163+
164+
$adapter = new Adapter($driver);
165+
166+
$engine = new Engine();
167+
$engine->id = 1;
168+
$engine->cm3 = 3;
169+
$engine->pistons = 6;
170+
$engine->horsepower = 300;
171+
172+
$dynamicTableGateway = new DynamicTableGateway($adapter);
173+
$dynamicTableGateway->update($engine);
174+
}
175+
176+
/**
177+
* @throws \Zend\Cache\Exception\ExceptionInterface
178+
*/
179+
public function testDelete()
180+
{
181+
$lastInsertId = 19950405;
182+
183+
$connection = (new MockBuilder($this, Connection::class))->getMock();
184+
$connection->method('getLastGeneratedValue')->willReturn($lastInsertId);
185+
186+
$result = (new MockBuilder($this, Result::class))->getMock();
187+
$result->method('getAffectedRows')->willReturn(1);
188+
189+
$statementContainer = (new MockBuilder($this, StatementContainer::class))->getMock();
190+
$statementContainer->method('execute')->willReturn($result);
191+
192+
$driver = (new MockBuilder($this, DriverInterface::class))->disableOriginalConstructor()->getMock();
193+
$driver->method('createStatement')->willReturn($statementContainer);
194+
$driver->method('getConnection')->willReturn($connection);
195+
196+
$adapter = new Adapter($driver);
197+
198+
$engine = new Engine();
199+
$engine->id = 1;
200+
$engine->cm3 = 3;
201+
$engine->pistons = 6;
202+
$engine->horsepower = 300;
203+
204+
$dynamicTableGateway = new DynamicTableGateway($adapter);
205+
$dynamicTableGateway->delete($engine);
206+
}
105207
}

0 commit comments

Comments
 (0)