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 ;
@@ -81,7 +82,7 @@ public function onFlush(EventArgs $args)
81
82
$ new = array_key_exists ($ field , $ changeSet ) ? $ changeSet [$ field ][1 ] : false ;
82
83
if (null === $ new ) { // let manual values
83
84
$ needChanges = true ;
84
- $ this ->updateField ($ object , $ ea , $ meta , $ field );
85
+ $ this ->updateField ($ object , $ ea , $ meta , $ field, $ config );
85
86
}
86
87
}
87
88
}
@@ -93,7 +94,7 @@ public function onFlush(EventArgs $args)
93
94
&& null === $ changeSet [$ field ][1 ];
94
95
if (!isset ($ changeSet [$ field ]) || $ isInsertAndNull ) { // let manual values
95
96
$ needChanges = true ;
96
- $ this ->updateField ($ object , $ ea , $ meta , $ field );
97
+ $ this ->updateField ($ object , $ ea , $ meta , $ field, $ config );
97
98
}
98
99
}
99
100
}
@@ -144,7 +145,7 @@ public function onFlush(EventArgs $args)
144
145
145
146
if (null === $ configuredValues || ($ singleField && in_array ($ value , $ configuredValues , true ))) {
146
147
$ needChanges = true ;
147
- $ this ->updateField ($ object , $ ea , $ meta , $ options ['field ' ]);
148
+ $ this ->updateField ($ object , $ ea , $ meta , $ options ['field ' ], $ config );
148
149
}
149
150
}
150
151
}
@@ -172,14 +173,14 @@ public function prePersist(EventArgs $args)
172
173
if (isset ($ config ['update ' ])) {
173
174
foreach ($ config ['update ' ] as $ field ) {
174
175
if (null === $ meta ->getReflectionProperty ($ field )->getValue ($ object )) { // let manual values
175
- $ this ->updateField ($ object , $ ea , $ meta , $ field );
176
+ $ this ->updateField ($ object , $ ea , $ meta , $ field, $ config );
176
177
}
177
178
}
178
179
}
179
180
if (isset ($ config ['create ' ])) {
180
181
foreach ($ config ['create ' ] as $ field ) {
181
182
if (null === $ meta ->getReflectionProperty ($ field )->getValue ($ object )) { // let manual values
182
- $ this ->updateField ($ object , $ ea , $ meta , $ field );
183
+ $ this ->updateField ($ object , $ ea , $ meta , $ field, $ config );
183
184
}
184
185
}
185
186
}
@@ -204,10 +205,11 @@ abstract protected function getFieldValue($meta, $field, $eventAdapter);
204
205
* @param AdapterInterface $eventAdapter
205
206
* @param ClassMetadata $meta
206
207
* @param string $field
208
+ * @param array $config
207
209
*
208
210
* @return void
209
211
*/
210
- protected function updateField ($ object , $ eventAdapter , $ meta , $ field )
212
+ protected function updateField ($ object , $ eventAdapter , $ meta , $ field, array $ config = [] )
211
213
{
212
214
$ property = $ meta ->getReflectionProperty ($ field );
213
215
$ oldValue = $ property ->getValue ($ object );
@@ -223,7 +225,18 @@ protected function updateField($object, $eventAdapter, $meta, $field)
223
225
}
224
226
}
225
227
226
- $ property ->setValue ($ object , $ newValue );
228
+ if (!empty ($ config ['setterMethod ' ][$ field ])) {
229
+ $ reflectionClass = $ meta ->getReflectionClass ();
230
+ $ setterName = $ config ['setterMethod ' ][$ field ];
231
+
232
+ if (!$ reflectionClass ->hasMethod ($ setterName )) {
233
+ throw new InvalidMappingException ("Setter method - [ {$ setterName }] does not exist in class - {$ meta ->getName ()}" );
234
+ }
235
+
236
+ $ reflectionClass ->getMethod ($ setterName )->invoke ($ object , $ newValue );
237
+ } else {
238
+ $ property ->setValue ($ object , $ newValue );
239
+ }
227
240
228
241
if ($ object instanceof NotifyPropertyChanged) {
229
242
$ uow = $ eventAdapter ->getObjectManager ()->getUnitOfWork ();
0 commit comments