@@ -43,7 +43,7 @@ like this:
43
43
audit_trail :
44
44
enabled : true
45
45
marking_store :
46
- type : ' multiple_state' # or 'single_state'
46
+ type : ' multiple_state' # or 'single_state', 'method' ('method' was added in 4.3)
47
47
arguments :
48
48
- ' currentPlace'
49
49
supports :
@@ -126,7 +126,7 @@ like this:
126
126
'enabled' => true
127
127
],
128
128
'marking_store' => [
129
- 'type' => 'multiple_state', // or 'single_state'
129
+ 'type' => 'multiple_state', // or 'single_state', 'method' ('method' was added in 4.3)
130
130
'arguments' => ['currentPlace'],
131
131
],
132
132
'supports' => ['App\Entity\BlogPost'],
@@ -166,7 +166,7 @@ As configured, the following property is used by the marking store::
166
166
167
167
A3E2
.. note ::
168
168
169
- The marking store type could be "multiple_state" or "single_state ".
169
+ The marking store type could be "multiple_state", "single_state" or "method ".
170
170
A single state marking store does not support a model being on multiple places
171
171
at the same time.
172
172
@@ -220,11 +220,87 @@ you can get the workflow by injecting the Workflow registry service::
220
220
// ... if the transition is not allowed
221
221
}
222
222
223
+ // Update the currentState on the post passing some contextual data
224
+ // to the whole workflow process
225
+ try {
226
+ $workflow->apply($post, 'publish', [
227
+ 'log_comment' => 'My logging comment for the publish transition.',
228
+ ]);
229
+ } catch (TransitionException $exception) {
230
+ // ... if the transition is not allowed
231
+ }
232
+
223
233
// See all the available transitions for the post in the current state
224
234
$transitions = $workflow->getEnabledTransitions($post);
225
235
}
226
236
}
227
237
238
+ .. versionadded :: 4.1
239
+
240
+ The :class: `Symfony\\ Component\\ Workflow\\ Exception\\ TransitionException `
241
+ class was introduced in Symfony 4.1.
242
+
243
+ .. versionadded :: 4.1
244
+
245
+ The :method: `Symfony\\ Component\\ Workflow\\ Registry::all ` method was
246
+ introduced in Symfony 4.1.
247
+
248
+ .. versionadded :: 4.3
249
+
250
+ The :method: `Symfony\\ Component\\ Workflow\\ Workflow::apply ` has now a new parameter ``$context ``
251
+ that is passed to the :class: `Symfony\\ Component\\ Workflow\\ MarkingStore\\ MarkingStoreInterface `
252
+ :method: `Symfony\\ Component\\ Workflow\\ MarkingStore\\ MarkingStoreInterface::setMarking ` method.
253
+
254
+ An example of usage with the ``$context `` parameter can be when you need,
255
+ in addition of marking your object in its new place, to contextualize this change.
256
+
257
+ .. tip ::
258
+
259
+ Configure the ``type `` as ``method `` of the ``marking_store `` option to use this feature
260
+ without implementing your own marking store.
261
+
262
+ You can also use this ``$context `` in your own marking store implementation.
263
+ A simple implementation example is when you want to store the place as integer instead of string in your object.
264
+
265
+ Lets say your object has a status property, stored as an integer in your storage, and you want to log an optional
266
+ comment any time the status changes::
267
+
268
+ // your own implementation class, to define in the configuration "marking_store"
269
+
270
+ class ObjectMarkingStore implements MarkingStoreInterface
271
+ {
272
+ public function getMarking($subject)
273
+ {
274
+ $subject->getStatus();
275
+ // ...
276
+ // return a marking
277
+ }
278
+
279
+ public function setMarking($subject, Marking $marking, array $context);
280
+ {
281
+ // ...
282
+ $subject->setStatus($newStatus, $context['log_comment'] ?? null);
283
+ }
284
+ }
285
+
286
+ // and in your Object class
287
+
288
+ public function getStatus()
289
+ {
290
+ return $this->status;
291
+ }
292
+
293
+ public function setStatus(int $status, ?string $comment = null)
294
+ {
295
+ $this->status = $status;
296
+ $this->addStatusLogRecord(new StatusLog($this, $comment));
297
+
298
+ return $this;
299
+ }
300
+
301
+ // the StatusLog class can have a createdAt, a username,
302
+ // the new status, and finally your optional comment retrieved from the workflow context.
303
+
228
304
Using Events
229
305
------------
230
306
0 commit comments