Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitaf0da29

Browse files
noniagriconomiexabbuh
authored andcommitted
Documentation workflow context apply
1 parentf3d7488 commitaf0da29

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
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)

[8]ページ先頭

©2009-2025 Movatter.jp