10000 Documentation workflow context apply · symfony/symfony-docs@af0da29 · GitHub
[go: up one dir, main page]

Skip to content

Commit af0da29

Browse files
noniagriconomiexabbuh
authored andcommitted
Documentation workflow context apply
1 parent f3d7488 commit af0da29

File tree

4 files changed

+114
-5
lines changed

4 files changed

+114
-5
lines changed

contributing/documentation/overview.rst

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,10 @@ purposes following these steps:
270270
271271
The generated documentation is available in the ``_build/html`` directory.
272272

273+
.. tip::
274+
275+
You can also use `Docker`_ that wraps all this for you!
276+
273277
Frequently Asked Questions
274278
--------------------------
275279

@@ -332,3 +336,4 @@ definitely don't want you to waste your time!
332336
.. _`pip installation`: https://pip.pypa.io/en/stable/installing/
333337
.. _`Sphinx`: http://sphinx-doc.org/
334338
.. _`Sphinx Extensions for PHP and Symfony`: https://github.com/fabpot/sphinx-php
339+
.. _`Docker`: https://github.com/symfony/symfony-docs#docker

workflow.rst

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,9 @@ best kept away from your models and should be defined in configuration.
88

99
A **definition** of a workflow consist of places and actions to get from one
1010
place to another. The actions are called **transitions**. A workflow does also
11-
need to know each object's position in the workflow. That **marking store** writes
12-
to a property of the object to remember the current place.
11+
need to know each position an object can be in the workflow. This is the goal of the
12+
**marking store** that reads from and writes to a property of the object, or somewhere else, the current **place(s)**
13+
to remember.
1314

1415
.. note::
1516

workflow/state-machines.rst

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,33 @@ you can get this state machine by injecting the Workflow registry service::
209209
public function someMethod($subject)
210210
{
211211
$stateMachine = $this->workflows->get($subject, 'pull_request');
212+
$stateMachine->apply($subject, 'wait_for_review');
213+
// ...
214+
}
215+
216+
// ...
217+
}
218+
219+
Symfony also creates automatically for you a service for each workflow (:class:`Symfony\\Component\\Workflow\\Workflow`) or state machine (:class:`Symfony\\Component\\Workflow\\StateMachine`) you have defined in your configuration.
220+
This means that you can use respectively ``workflow.pull_request`` or ``state_machine.pull_request`` in your service definition to have directly the proper service::
221+
222+
// ...
223+
use Symfony\Component\Workflow\StateMachine;
224+
225+
class SomeService
226+
{
227+
private $stateMachine;
228+
229+
public function __construct(StateMachine $stateMachine)
230+
{
231+
$this->stateMachine = $stateMachine;
232+
}
233+
234+
public function someMethod($subject)
235+
{
236+
$this->stateMachine->apply($subject, 'wait_for_review', [
237+
'log_comment' => 'My logging comment for the wait for review transition.',
238+
]);
212239
// ...
213240
}
214241

workflow/usage.rst

Lines changed: 79 additions & 3 deletions
EF5E
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ like this:
4343
audit_trail:
4444
enabled: true
4545
marking_store:
46-
type: 'multiple_state' # or 'single_state'
46+
type: 'multiple_state' # or 'single_state', 'method' ('method' was added in 4.3)
4747
arguments:
4848
- 'currentPlace'
4949
supports:
@@ -127,7 +127,7 @@ like this:
127127
'enabled' => true
128128
],
129129
'marking_store' => [
130-
'type' => 'multiple_state', // or 'single_state'
130+
'type' => 'multiple_state', // or 'single_state', 'method' ('method' was added in 4.3)
131131
'arguments' => ['currentPlace'],
132132
],
133133
'supports' => ['App\Entity\BlogPost'],
@@ -167,7 +167,7 @@ As configured, the following property is used by the marking store::
167167

168168
.. note::
169169

170-
The marking store type could be "multiple_state" or "single_state".
170+
The marking store type could be "multiple_state", "single_state" or "method".
171171
A single state marking store does not support a model being on multiple places
172172
at the same time.
173173

@@ -221,11 +221,87 @@ you can get the workflow by injecting the Workflow registry service::
221221
// ... if the transition is not allowed
222222
}
223223

224+
// Update the currentState on the post passing some contextual data
225+
// to the whole workflow process
226+
try {
227+
$workflow->apply($post, 'publish', [
228+
'log_comment' => 'My logging comment for the publish transition.',
229+
]);
230+
} catch (TransitionException $exception) {
231+
// ... if the transition is not allowed
232+
}
233+
224234
// See all the available transitions for the post in the current state
225235
$transitions = $workflow->getEnabledTransitions($post);
226236
}
227237
}
228238

239+
.. versionadded:: 4.1
240+
241+
The :class:`Symfony\\Component\\Workflow\\Exception\\TransitionException`
242+
class was introduced in Symfony 4.1.
243+
244+
.. versionadded:: 4.1
245+
246+
The :method:`Symfony\\Component\\Workflow\\Registry::all` method was
247+
introduced in Symfony 4.1.
248+
249+
.. versionadded:: 4.3
250+
251+
The :method:`Symfony\\Component\\Workflow\\Workflow::apply` has now a new parameter ``$context``
252+
that is passed to the :class:`Symfony\\Component\\Workflow\\MarkingStore\\MarkingStoreInterface`
253+
:method:`Symfony\\Component\\Workflow\\MarkingStore\\MarkingStoreInterface::setMarking` method.
254+
255+
An example of usage with the ``$context`` parameter can be when you need,
256+
in addition of marking your object in its new place, to contextualize this change.
257+
258+
.. tip::
259+
260+
Configure the ``type`` as ``method`` of the ``marking_store`` option to use this feature
261+
without implementing your own marking store.
262+
263+
You can also use this ``$context`` in your own marking store implementation.
264+
A simple implementation example is when you want to store the place as integer instead of string in your object.
265+
266+
Lets say your object has a status property, stored as an integer in your storage, and you want to log an optional
267+
comment any time the status changes::
268+
269+
// your own implementation class, to define in the configuration "marking_store"
270+
271+
class ObjectMarkingStore implements MarkingStoreInterface
272+
{
273+
public function getMarking($subject)
274+
{
275+
$subject->getStatus();
276+
// ...
277+
// return a marking
278+
}
279+
280+
public function setMarking($subject, Marking $marking, array $context);
281+
{
282+
// ...
283+
$subject->setStatus($newStatus, $context['log_comment'] ?? null);
284+
}
285+
}
286+
287+
// and in your Object class
288+
289+
public function getStatus()
290+
{
291+
return $this->status;
292+
}
293+
294+
public function setStatus(int $status, ?string $comment = null)
295+
{
296+
$this->status = $status;
297+
$this->addStatusLogRecord(new StatusLog($this, $comment));
298+
299+
return $this;
300+
}
301+
302+
// the StatusLog class can have a createdAt, a username,
303+
// the new status, and finally your optional comment retrieved from the workflow context.
304+
229305
Using Events
230306
------------
231307

0 commit comments

Comments
 (0)
0