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