1
|
|
|
<?php |
2
|
|
|
|
3
|
|
|
namespace Bludata\Doctrine\ORM\Repositories; |
4
|
|
|
|
5
|
|
|
use Bludata\Doctrine\Common\Interfaces\BaseEntityInterface; |
6
|
|
|
use Bludata\Doctrine\Common\Interfaces\BaseRepositoryInterface; |
7
|
|
|
use Doctrine\ORM\EntityRepository; |
8
|
|
|
use Symfony\Component\Validator\ValidatorBuilder; |
9
|
|
|
|
10
|
|
View Code Duplication |
abstract class BaseRepository extends EntityRepository implements BaseRepositoryInterface |
|
|
|
|
11
|
|
|
{ |
12
|
|
|
/** |
13
|
|
|
* Método executado nos eventos ORM\PrePersist e ORM\PreUpdate. |
14
|
|
|
*/ |
15
|
|
|
public function preSave(BaseEntityInterface $entity) |
16
|
|
|
{ |
17
|
|
|
return $this; |
18
|
|
|
} |
19
|
|
|
|
20
|
|
|
/** |
21
|
|
|
* Método executado nos eventos ORM\PostPersist e ORM\PostUpdate. |
22
|
|
|
*/ |
23
|
|
|
public function postSave(BaseEntityInterface $entity) |
24
|
|
|
{ |
25
|
|
|
return $this; |
26
|
|
|
} |
27
|
|
|
|
28
|
|
|
/** |
29
|
|
|
* Método executado no evento ORM\PreFlush. |
30
|
|
|
*/ |
31
|
|
|
public function preFlush(BaseEntityInterface $entity) |
32
|
|
|
{ |
33
|
|
|
return $this; |
34
|
|
|
} |
35
|
|
|
|
36
|
|
|
public function validate(BaseEntityInterface $entity) |
37
|
|
|
{ |
38
|
|
|
$validator = (new ValidatorBuilder()) |
39
|
|
|
->enableAnnotationMapping() |
40
|
|
|
->getValidator(); |
41
|
|
|
|
42
|
|
|
$violations = $validator->validate($entity); |
43
|
|
|
|
44
|
|
|
$errors = []; |
45
|
|
|
|
46
|
|
|
if (count($violations)) { |
47
|
|
|
foreach ($violations as $violation) { |
48
|
|
|
$errors[] = $violation->getMessage(); |
49
|
|
|
} |
50
|
|
|
|
51
|
|
|
abort(400, json_encode($errors)); |
52
|
|
|
} |
53
|
|
|
} |
54
|
|
|
|
55
|
|
|
public function getClassMetadata() |
56
|
|
|
{ |
57
|
|
|
return parent::getClassMetadata(); |
58
|
|
|
} |
59
|
|
|
|
60
|
|
|
public function getEntityName() |
61
|
|
|
{ |
62
|
|
|
return parent::getEntityName(); |
63
|
|
|
} |
64
|
|
|
|
65
|
|
|
public function createEntity() |
66
|
|
|
{ |
67
|
|
|
return app($this->getEntityName()); |
68
|
|
|
} |
69
|
|
|
|
70
|
|
|
public function createQueryWorker() |
71
|
|
|
{ |
72
|
|
|
return new QueryWorker($this); |
73
|
|
|
} |
74
|
|
|
|
75
|
|
|
public function query() |
76
|
|
|
{ |
77
|
|
|
return $this->createQueryBuilder('t'); |
78
|
|
|
} |
79
|
|
|
|
80
|
|
|
/** |
81
|
|
|
* @return QueryWorker |
82
|
|
|
*/ |
83
|
|
|
public function findAll() |
84
|
|
|
{ |
85
|
|
|
return $this->createQueryWorker(); |
|
|
|
|
86
|
|
|
} |
87
|
|
|
|
88
|
|
|
public function findOneBy(array $filters, $abort = true) |
89
|
|
|
{ |
90
|
|
|
$entity = parent::findOneBy($filters); |
91
|
|
|
|
92
|
|
|
if (!$entity && $abort) { |
93
|
|
|
abort(404, $this->getMessageNotFound()); |
94
|
|
|
} |
95
|
|
|
|
96
|
|
|
return $entity; |
97
|
|
|
} |
98
|
|
|
|
99
|
|
|
public function find($id, $abort = true) |
100
|
|
|
{ |
101
|
|
|
return is_object($id) ? $id : $this->findOneBy(['id' => $id], $abort); |
102
|
|
|
} |
103
|
|
|
|
104
|
|
|
/** |
105
|
|
|
* Inserir ou atualizar um registro. |
106
|
|
|
* |
107
|
|
|
* @param null | string | int | array |
108
|
|
|
* |
109
|
|
|
* @throws InvalidArgumentException Se $input não for null | string | int | array é lançada a exceção |
|
|
|
|
110
|
|
|
*/ |
111
|
|
|
public function findOrCreate($input) |
112
|
|
|
{ |
113
|
|
|
if (is_null($input)) { |
114
|
|
|
return $input; |
115
|
|
|
} |
116
|
|
|
|
117
|
|
|
if (is_string($input)) { |
118
|
|
|
$input = json_decode($input, true); |
|
|
|
|
119
|
|
|
} |
120
|
|
|
|
121
|
|
|
if (is_numeric($input)) { |
122
|
|
|
return $this->find($input); |
123
|
|
|
} |
124
|
|
|
|
125
|
|
|
if (is_array($input)) { |
126
|
|
|
if (array_key_exists('id', $input) && $input['id']) { |
127
|
|
|
$object = $this->find($input['id']); |
128
|
|
|
} else { |
129
|
|
|
$object = $this->createEntity(); |
130
|
|
|
} |
131
|
|
|
|
132
|
|
|
$object->setPropertiesEntity($input); |
133
|
|
|
|
134
|
|
|
return $object; |
135
|
|
|
} |
136
|
|
|
|
137
|
|
|
throw new InvalidArgumentException('O parâmetro $input pode ser um null | string | int | array'); |
|
|
|
|
138
|
|
|
} |
139
|
|
|
|
140
|
|
|
/** |
141
|
|
|
* Marcar um registro como deletado. |
142
|
|
|
* |
143
|
|
|
* @param object | int $target |
144
|
|
|
* |
145
|
|
|
* @throws Symfony\Component\HttpKernel\Exception\NotFoundHttpException Se $target não for encontrado |
|
|
|
|
146
|
|
|
* |
147
|
|
|
* Bludata\Doctrine\Common\Interfaces |
148
|
|
|
*/ |
149
|
|
|
public function remove($target) |
150
|
|
|
{ |
151
|
|
|
$entity = $this->find($target); |
152
|
|
|
|
153
|
|
|
$this->em()->remove($entity); |
|
|
|
|
154
|
|
|
|
155
|
|
|
return $entity; |
156
|
|
|
} |
157
|
|
|
|
158
|
|
|
/** |
159
|
|
|
* @param Bludata\Doctrine\Common\Interfaces\BaseEntityInterface $entity |
|
|
|
|
160
|
|
|
* |
161
|
|
|
* @return Bludata\Doctrine\ORM\Repositories\QueryWorker |
|
|
|
|
162
|
|
|
*/ |
163
|
|
|
public function save(BaseEntityInterface $entity) |
164
|
|
|
{ |
165
|
|
|
$this->em()->persist($entity); |
166
|
|
|
|
167
|
|
|
return $this; |
168
|
|
|
} |
169
|
|
|
|
170
|
|
|
/** |
171
|
|
|
* @param Bludata\Doctrine\Common\Interfaces\BaseEntityInterface $entity |
|
|
|
|
172
|
|
|
* |
173
|
|
|
* @return Bludata\Doctrine\ORM\Repositories\QueryWorker |
|
|
|
|
174
|
|
|
*/ |
175
|
|
|
public function flush(BaseEntityInterface $entity = null) |
176
|
|
|
{ |
177
|
|
|
$this->em()->flush($entity); |
178
|
|
|
|
179
|
|
|
return $this; |
180
|
|
|
} |
181
|
|
|
|
182
|
|
|
public function em() |
|
|
|
|
183
|
|
|
{ |
184
|
|
|
return parent::getEntityManager(); |
|
|
|
|
185
|
|
|
} |
186
|
|
|
} |
187
|
|
|
|
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.
You can also find more detailed suggestions in the “Code” section of your repository.