18
18
use Doctrine \Persistence \Mapping \ClassMetadata ;
19
19
use Doctrine \Persistence \NotifyPropertyChanged ;
20
20
use Doctrine \Persistence \ObjectManager ;
21
+ use Gedmo \Exception \InvalidMappingException ;
21
22
use Gedmo \Exception \UnexpectedValueException ;
22
23
use Gedmo \Mapping \Event \AdapterInterface ;
23
24
use Gedmo \Mapping \MappedEventSubscriber ;
@@ -83,7 +84,7 @@ public function onFlush(EventArgs $args)
83
84
$ new = array_key_exists ($ field , $ changeSet ) ? $ changeSet [$ field ][1 ] : false ;
84
85
if (null === $ new ) { // let manual values
85
86
$ needChanges = true ;
86
- $ this ->updateField ($ object , $ ea , $ meta , $ field );
87
+ $ this ->updateField ($ object , $ ea , $ meta , $ field, $ config );
87
88
}
88
89
}
89
90
}
@@ -95,7 +96,7 @@ public function onFlush(EventArgs $args)
95
96
&& null === $ changeSet [$ field ][1 ];
96
97
if (!isset ($ changeSet [$ field ]) || $ isInsertAndNull ) { // let manual values
97
98
$ needChanges = true ;
98
- $ this ->updateField ($ object , $ ea , $ meta , $ field );
99
+ $ this ->updateField ($ object , $ ea , $ meta , $ field, $ config );
99
100
}
100
101
}
101
102
}
@@ -146,7 +147,7 @@ public function onFlush(EventArgs $args)
146
147
147
148
if (null === $ configuredValues || ($ singleField && in_array ($ value , $ configuredValues , true ))) {
148
149
$ needChanges = true ;
149
- $ this ->updateField ($ object , $ ea , $ meta , $ options ['field ' ]);
150
+ $ this ->updateField ($ object , $ ea , $ meta , $ options ['field ' ], $ config );
150
151
}
151
152
}
152
153
}
@@ -174,14 +175,14 @@ public function prePersist(EventArgs $args)
174
175
if (isset ($ config ['update ' ])) {
175
176
foreach ($ config ['update ' ] as $ field ) {
176
177
if (null === $ meta ->getReflectionProperty ($ field )->getValue ($ object )) { // let manual values
177
- $ this ->updateField ($ object , $ ea , $ meta , $ field );
178
+ $ this ->updateField ($ object , $ ea , $ meta , $ field, $ config );
178
179
}
179
180
}
180
181
}
181
182
if (isset ($ config ['create ' ])) {
182
183
foreach ($ config ['create ' ] as $ field ) {
183
184
if (null === $ meta ->getReflectionProperty ($ field )->getValue ($ object )) { // let manual values
184
- $ this ->updateField ($ object , $ ea , $ meta , $ field );
185
+ $ this ->updateField ($ object , $ ea , $ meta , $ field, $ config );
185
186
}
186
187
}
187
188
}
@@ -206,10 +207,11 @@ abstract protected function getFieldValue($meta, $field, $eventAdapter);
206
207
* @param AdapterInterface $eventAdapter
207
208
* @param ClassMetadata $meta
208
209
* @param string $field
210
+ * @param array $config
209
211
*
210
212
* @return void
211
213
*/
212
- protected function updateField ($ object , $ eventAdapter , $ meta , $ field )
214
+ protected function updateField ($ object , $ eventAdapter , $ meta , $ field, array $ config = [] )
213
215
{
214
216
$ property = $ meta ->getReflectionProperty ($ field );
215
217
$ oldValue = $ property ->getValue ($ object );
@@ -225,7 +227,18 @@ protected function updateField($object, $eventAdapter, $meta, $field)
225
227
}
226
228
}
227
229
228
- $ property ->setValue ($ object , $ newValue );
230
+ if (!empty ($ config ['setterMethod ' ][$ field ])) {
231
+ $ reflectionClass = $ meta ->getReflectionClass ();
232
+ $ setterName = $ config ['setterMethod ' ][$ field ];
233
+
234
+ if (!$ reflectionClass ->hasMethod ($ setterName )) {
235
+ throw new InvalidMappingException ("Setter method - [ {$ setterName }] does not exist in class - {$ meta ->getName ()}" );
236
+ }
237
+
238
+ $ reflectionClass ->getMethod ($ setterName )->invoke ($ object , $ newValue );
239
+ } else {
240
+ $ property ->setValue ($ object , $ newValue );
241
+ }
229
242
230
243
if ($ object instanceof NotifyPropertyChanged) {
231
244
$ uow = $ eventAdapter ->getObjectManager ()->getUnitOfWork ();
0 commit comments