Skip to content

Commit f12ac1e

Browse files
committed
Use getFieldValue and setFieldValue methods
1 parent ea1d375 commit f12ac1e

27 files changed

Lines changed: 158 additions & 167 deletions

File tree

src/AbstractTrackingListener.php

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ public function onFlush(EventArgs $args)
149149
}
150150
$objectMeta = $om->getClassMetadata(get_class($changingObject));
151151
$om->initializeObject($changingObject);
152-
$value = $objectMeta->getReflectionProperty($trackedChild)->getValue($changingObject);
152+
$value = $objectMeta->getFieldValue($changingObject, $trackedChild);
153153
} else {
154154
$value = $changes[1];
155155
}
@@ -189,14 +189,14 @@ public function prePersist(EventArgs $args)
189189
if ($config = $this->getConfiguration($om, $meta->getName())) {
190190
if (isset($config['update'])) {
191191
foreach ($config['update'] as $field) {
192-
if (null === $meta->getReflectionProperty($field)->getValue($object)) { // let manual values
192+
if (null === $meta->getFieldValue($object, $field)) { // let manual values
193193
$this->updateField($object, $ea, $meta, $field);
194194
}
195195
}
196196
}
197197
if (isset($config['create'])) {
198198
foreach ($config['create'] as $field) {
199-
if (null === $meta->getReflectionProperty($field)->getValue($object)) { // let manual values
199+
if (null === $meta->getFieldValue($object, $field)) { // let manual values
200200
$this->updateField($object, $ea, $meta, $field);
201201
}
202202
}
@@ -227,8 +227,7 @@ abstract protected function getFieldValue($meta, $field, $eventAdapter);
227227
*/
228228
protected function updateField($object, $eventAdapter, $meta, $field)
229229
{
230-
$property = $meta->getReflectionProperty($field);
231-
$oldValue = $property->getValue($object);
230+
$oldValue = $meta->getFieldValue($object, $field);
232231
$newValue = $this->getFieldValue($meta, $field, $eventAdapter);
233232

234233
// if field value is reference, persist object
@@ -241,7 +240,7 @@ protected function updateField($object, $eventAdapter, $meta, $field)
241240
}
242241
}
243242

244-
$property->setValue($object, $newValue);
243+
$meta->setFieldValue($object, $field, $newValue);
245244

246245
if ($object instanceof NotifyPropertyChanged) {
247246
$uow = $eventAdapter->getObjectManager()->getUnitOfWork();

src/Loggable/LoggableListener.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ public function postPersist(EventArgs $args)
173173
$logEntryMeta = $om->getClassMetadata(get_class($logEntry));
174174

175175
$id = $wrapped->getIdentifier(false, true);
176-
$logEntryMeta->getReflectionProperty('objectId')->setValue($logEntry, $id);
176+
$logEntryMeta->setFieldValue($logEntry, 'objectId', $id);
177177
$uow->scheduleExtraUpdate($logEntry, [
178178
'objectId' => [null, $id],
179179
]);

src/Loggable/Mapping/Event/Adapter/ODM.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ public function getNewVersion($meta, $object)
4343
$dm = $this->getObjectManager();
4444
$objectMeta = $dm->getClassMetadata(get_class($object));
4545
$identifierField = $this->getSingleIdentifierFieldName($objectMeta);
46-
$objectId = $objectMeta->getReflectionProperty($identifierField)->getValue($object);
46+
$objectId = $objectMeta->getFieldValue($object, $identifierField);
4747

4848
$qb = $dm->createQueryBuilder($meta->getName());
4949
$qb->select('version');

src/Mapping/Event/Adapter/ODM.php

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
use Doctrine\ODM\MongoDB\DocumentManager;
1515
use Doctrine\ODM\MongoDB\Event\LifecycleEventArgs;
1616
use Doctrine\ODM\MongoDB\Mapping\ClassMetadata;
17+
use Doctrine\ODM\MongoDB\UnitOfWork;
1718
use Gedmo\Exception\RuntimeException;
1819
use Gedmo\Mapping\Event\AdapterInterface;
1920

@@ -29,6 +30,8 @@ class ODM implements AdapterInterface
2930

3031
private ?DocumentManager $dm = null;
3132

33+
private static ?bool $useIntId = null;
34+
3235
public function __call($method, $args)
3336
{
3437
Deprecation::trigger(
@@ -150,12 +153,12 @@ public function getScheduledObjectDeletions($uow)
150153

151154
public function setOriginalObjectProperty($uow, $object, $property, $value)
152155
{
153-
$uow->setOriginalDocumentProperty(spl_object_hash($object), $property, $value);
156+
$uow->setOriginalDocumentProperty($this->getOid($uow, $object), $property, $value);
154157
}
155158

156159
public function clearObjectChangeSet($uow, $object)
157160
{
158-
$uow->clearDocumentChangeSet(spl_object_hash($object));
161+
$uow->clearDocumentChangeSet($this->getOid($uow, $object));
159162
}
160163

161164
/**
@@ -179,4 +182,21 @@ public function createLifecycleEventArgsInstance($document, $documentManager)
179182

180183
return new LifecycleEventArgs($document, $documentManager);
181184
}
185+
186+
/**
187+
* @return int|string dependent on the version of `doctrine/mongodb-odm` installed
188+
*/
189+
private function getOid(UnitOfWork $uow, object $object)
190+
{
191+
if (null === self::$useIntId) {
192+
$refl = new \ReflectionClass($uow);
193+
$method = $refl->getMethod('setOriginalDocumentProperty');
194+
$oidArg = $method->getParameters()[0];
195+
196+
/** @phpstan-ignore-next-line method.NotFound All supported versions of `doctrine/mongodb-odm` have the first param typehinted */
197+
self::$useIntId = 'int' === $oidArg->getType()->getName();
198+
}
199+
200+
return true === self::$useIntId ? spl_object_id($object) : spl_object_hash($object);
201+
}
182202
}

src/Mapping/MappedEventSubscriber.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -307,7 +307,7 @@ protected function setFieldValue(AdapterInterface $adapter, $object, $field, $ol
307307
$meta = $manager->getClassMetadata(get_class($object));
308308
$uow = $manager->getUnitOfWork();
309309

310-
$meta->getReflectionProperty($field)->setValue($object, $newValue);
310+
$meta->setFieldValue($object, $field, $newValue);
311311
$uow->propertyChanged($object, $field, $oldValue, $newValue);
312312
$adapter->recomputeSingleObjectChangeSet($uow, $meta, $object);
313313
}

src/ReferenceIntegrity/ReferenceIntegrityListener.php

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,7 @@ public function preRemove(EventArgs $args)
7676

7777
if ($config = $this->getConfiguration($om, $meta->getName())) {
7878
foreach ($config['referenceIntegrity'] as $property => $action) {
79-
$reflProp = $meta->getReflectionProperty($property);
80-
$refDoc = $reflProp->getValue($object);
79+
$refDoc = $meta->getFieldValue($object, $property);
8180
$fieldMapping = $meta->getFieldMapping($property);
8281

8382
switch ($action) {
@@ -90,19 +89,19 @@ public function preRemove(EventArgs $args)
9089

9190
$subMeta = $om->getClassMetadata($fieldMapping->targetDocument ?? $fieldMapping['targetDocument']);
9291

93-
if (!$subMeta->hasField($fieldMapping->mappedBy ?? $fieldMapping['mappedBy'])) {
94-
throw new InvalidMappingException(sprintf('Unable to find reference integrity [%s] as mapped property in entity - %s', $fieldMapping->mappedBy ?? $fieldMapping['mappedBy'], $fieldMapping->targetDocument ?? $fieldMapping['targetDocument']));
95-
}
92+
$mappedByField = $fieldMapping->mappedBy ?? $fieldMapping['mappedBy'];
9693

97-
$refReflProp = $subMeta->getReflectionProperty($fieldMapping->mappedBy ?? $fieldMapping['mappedBy']);
94+
if (!$subMeta->hasField($mappedByField)) {
95+
throw new InvalidMappingException(sprintf('Unable to find reference integrity [%s] as mapped property in entity - %s', $mappedByField, $fieldMapping->targetDocument ?? $fieldMapping['targetDocument']));
96+
}
9897

9998
if ($meta->isCollectionValuedReference($property)) {
10099
foreach ($refDoc as $refObj) {
101-
$refReflProp->setValue($refObj, null);
100+
$subMeta->setFieldValue($refObj, $mappedByField, null);
102101
$om->persist($refObj);
103102
}
104103
} else {
105-
$refReflProp->setValue($refDoc, null);
104+
$subMeta->setFieldValue($refDoc, $mappedByField, null);
106105
$om->persist($refDoc);
107106
}
108107

@@ -116,27 +115,27 @@ public function preRemove(EventArgs $args)
116115

117116
$subMeta = $om->getClassMetadata($fieldMapping->targetDocument ?? $fieldMapping['targetDocument']);
118117

119-
if (!$subMeta->hasField($fieldMapping->mappedBy ?? $fieldMapping['mappedBy'])) {
120-
throw new InvalidMappingException(sprintf('Unable to find reference integrity [%s] as mapped property in entity - %s', $fieldMapping->mappedBy ?? $fieldMapping['mappedBy'], $fieldMapping->targetDocument ?? $fieldMapping['targetDocument']));
121-
}
118+
$mappedByField = $fieldMapping->mappedBy ?? $fieldMapping['mappedBy'];
122119

123-
if (!$subMeta->isCollectionValuedReference($fieldMapping->mappedBy ?? $fieldMapping['mappedBy'])) {
124-
throw new InvalidMappingException(sprintf('Reference integrity [%s] mapped property in entity - %s should be a Reference Many', $fieldMapping->mappedBy ?? $fieldMapping['mappedBy'], $fieldMapping->targetDocument ?? $fieldMapping['targetDocument']));
120+
if (!$subMeta->hasField($mappedByField)) {
121+
throw new InvalidMappingException(sprintf('Unable to find reference integrity [%s] as mapped property in entity - %s', $mappedByField, $fieldMapping->targetDocument ?? $fieldMapping['targetDocument']));
125122
}
126123

127-
$refReflProp = $subMeta->getReflectionProperty($fieldMapping->mappedBy ?? $fieldMapping['mappedBy']);
124+
if (!$subMeta->isCollectionValuedReference($mappedByField)) {
125+
throw new InvalidMappingException(sprintf('Reference integrity [%s] mapped property in entity - %s should be a Reference Many', $mappedByField, $fieldMapping->targetDocument ?? $fieldMapping['targetDocument']));
126+
}
128127

129128
if ($meta->isCollectionValuedReference($property)) {
130129
foreach ($refDoc as $refObj) {
131-
$collection = $refReflProp->getValue($refObj);
130+
$collection = $subMeta->getFieldValue($refObj, $mappedByField);
132131
$collection->removeElement($object);
133-
$refReflProp->setValue($refObj, $collection);
132+
$subMeta->setFieldValue($refObj, $mappedByField, $collection);
134133
$om->persist($refObj);
135134
}
136135
} elseif (is_object($refDoc)) {
137-
$collection = $refReflProp->getValue($refDoc);
136+
$collection = $subMeta->getFieldValue($refDoc, $mappedByField);
138137
$collection->removeElement($object);
139-
$refReflProp->setValue($refDoc, $collection);
138+
$subMeta->setFieldValue($refDoc, $mappedByField, $collection);
140139
$om->persist($refDoc);
141140
}
142141

src/References/Mapping/Event/Adapter/ODM.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ public function getIdentifier($om, $object, $single = true)
3838
$meta = $om->getClassMetadata(get_class($object));
3939
$id = [];
4040
foreach ($meta->getIdentifier() as $name) {
41-
$id[$name] = $meta->getReflectionProperty($name)->getValue($object);
41+
$id[$name] = $meta->getFieldValue($object, $name);
4242
// return null if one of identifiers is missing
4343
if (!$id[$name]) {
4444
return null;
@@ -73,7 +73,7 @@ public function extractIdentifier($om, $object, $single = true)
7373
if ($object instanceof GhostObjectInterface) {
7474
$id = $om->getUnitOfWork()->getDocumentIdentifier($object);
7575
} else {
76-
$id = $meta->getReflectionProperty($meta->getIdentifier()[0])->getValue($object);
76+
$id = $meta->getFieldValue($object, $meta->getIdentifier()[0]);
7777
}
7878

7979
if ($single || !$id) {

src/References/Mapping/Event/Adapter/ORM.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ public function getIdentifier($om, $object, $single = true)
3838
if ($object instanceof GhostObjectInterface) {
3939
$id = $om->getUnitOfWork()->getDocumentIdentifier($object);
4040
} else {
41-
$id = $meta->getReflectionProperty($meta->getIdentifier()[0])->getValue($object);
41+
$id = $meta->getFieldValue($object, $meta->getIdentifier()[0]);
4242
}
4343

4444
if ($single || !$id) {
@@ -51,7 +51,7 @@ public function getIdentifier($om, $object, $single = true)
5151
if ($om instanceof PhpcrDocumentManager) {
5252
$meta = $om->getClassMetadata(get_class($object));
5353
assert(1 === count($meta->getIdentifier()));
54-
$id = $meta->getReflectionProperty($meta->getIdentifier()[0])->getValue($object);
54+
$id = $meta->getFieldValue($object, $meta->getIdentifier()[0]);
5555

5656
if ($single || !$id) {
5757
return $id;
@@ -85,7 +85,7 @@ public function extractIdentifier($om, $object, $single = true)
8585
$meta = $om->getClassMetadata(get_class($object));
8686
$id = [];
8787
foreach ($meta->getIdentifier() as $name) {
88-
$id[$name] = $meta->getReflectionProperty($name)->getValue($object);
88+
$id[$name] = $meta->getFieldValue($object, $name);
8989
// return null if one of identifiers is missing
9090
if (!$id[$name]) {
9191
return null;

src/Sluggable/Handler/InversedRelativeSlugHandler.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,10 +113,10 @@ public function onSlugCompletion(SluggableAdapter $ea, array &$config, $object,
113113
continue;
114114
}
115115

116-
$objectSlug = (string) $meta->getReflectionProperty($mappedByConfig['slug'])->getValue($object);
116+
$objectSlug = (string) $meta->getFieldValue($object, $mappedByConfig['slug']);
117117
if (preg_match("@^{$oldSlug}@smi", $objectSlug)) {
118118
$objectSlug = str_replace($oldSlug, $slug, $objectSlug);
119-
$meta->getReflectionProperty($mappedByConfig['slug'])->setValue($object, $objectSlug);
119+
$meta->setFieldValue($object, $mappedByConfig['slug'], $objectSlug);
120120
$ea->setOriginalObjectProperty($uow, $object, $mappedByConfig['slug'], $objectSlug);
121121
}
122122
}

src/Sluggable/Handler/TreeSlugHandler.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -151,10 +151,10 @@ public function onSlugCompletion(SluggableAdapter $ea, array &$config, $object,
151151
continue;
152152
}
153153

154-
$objectSlug = (string) $meta->getReflectionProperty($config['slug'])->getValue($object);
154+
$objectSlug = (string) $meta->getFieldValue($object, $config['slug']);
155155
if (preg_match("@^{$target}{$config['pathSeparator']}@smi", $objectSlug)) {
156156
$objectSlug = str_replace($target, $slug, $objectSlug);
157-
$meta->getReflectionProperty($config['slug'])->setValue($object, $objectSlug);
157+
$meta->setFieldValue($object, $config['slug'], $objectSlug);
158158
$ea->setOriginalObjectProperty($uow, $object, $config['slug'], $objectSlug);
159159
}
160160
}

0 commit comments

Comments
 (0)