Skip to content

Commit 58d04bc

Browse files
committed
Merge pull request yohang#51 from yohang/refactor-callback-handler
[WIP] Refactor CallbackHandler
2 parents fc63d4d + bbeda5b commit 58d04bc

20 files changed

+863
-135
lines changed

examples/callbacks.php

+11-1
Original file line numberDiff line numberDiff line change
@@ -73,10 +73,20 @@ public function display()
7373
$loader->load($stateMachine);
7474
$stateMachine->initialize();
7575

76-
$stateMachine->getDispatcher()->addListener('finite.pre_transition', function(\Finite\Event\TransitionEvent $e) {
76+
$stateMachine->getDispatcher()->addListener(\Finite\Event\FiniteEvents::PRE_TRANSITION, function(\Finite\Event\TransitionEvent $e) {
7777
echo 'This is a pre transition', "\n";
7878
});
7979

80+
$foobar = 42;
81+
$stateMachine->getDispatcher()->addListener(
82+
\Finite\Event\FiniteEvents::POST_TRANSITION,
83+
\Finite\Event\Callback\CallbackBuilder::create($stateMachine)
84+
->setCallable(function () use ($foobar) {
85+
echo "\$foobar is ${foobar} and this is a post transition\n";
86+
})
87+
->getCallback()
88+
);
89+
8090
$stateMachine->apply('propose');
8191
$stateMachine->apply('reject');
8292
$stateMachine->apply('propose');

src/Finite/Bundle/FiniteBundle/DependencyInjection/FiniteFiniteExtension.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ public function load(array $configs, ContainerBuilder $container)
3131
$stateMachineConfig = $this->removeDisabledCallbacks($stateMachineConfig);
3232

3333
$definition = clone $container->getDefinition('finite.array_loader');
34-
$definition->addArgument($stateMachineConfig);
34+
$definition->replaceArgument(0, $stateMachineConfig);
3535
$definition->addTag('finite.loader');
3636

3737
// setLazy method wasn't available before 2.3, FiniteBundle requirement is ~2.1

src/Finite/Bundle/FiniteBundle/Resources/config/services.xml

+11-1
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,20 @@
1010
<parameter key="finite.factory.class">Finite\Factory\SymfonyDependencyInjectionFactory</parameter>
1111
<parameter key="finite.context.class">Finite\Context</parameter>
1212
<parameter key="finite.twig_extension.class">Finite\Extension\Twig\FiniteExtension</parameter>
13+
<parameter key="finite.callback.handler.class">Finite\Event\CallbackHandler</parameter>
14+
<parameter key="finite.callback.builder.factory.class">Finite\Event\Callback\CallbackBuilderFactory</parameter>
1315
</parameters>
1416

1517
<services>
16-
<service id="finite.array_loader" class="%finite.array_loader.class%" public="false" />
18+
<service id="finite.callback.handler" class="%finite.callback.handler.class%">
19+
<argument type="service" id="event_dispatcher" />
20+
</service>
21+
<service id="finite.callback.builder.factory" class="%finite.callback.builder.factory.class%" />
22+
<service id="finite.array_loader" class="%finite.array_loader.class%" public="false">
23+
<argument type="collection" />
24+
<argument type="service" id="finite.callback.handler" />
25+
<argument type="service" id="finite.callback.builder.factory" />
26+
</service>
1727
<service id="finite.state_machine" class="%finite.state_machine.class%" scope="prototype">
1828
<call method="setDispatcher">
1929
<argument type="service" id="event_dispatcher" />
+59
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
<?php
2+
3+
namespace Finite\Event\Callback;
4+
5+
use Finite\Event\TransitionEvent;
6+
7+
/**
8+
*
9+
*
10+
* @author Yohan Giarelli <[email protected]>
11+
*/
12+
class Callback implements CallbackInterface
13+
{
14+
/**
15+
* @var CallbackSpecificationInterface
16+
*/
17+
private $specification;
18+
19+
/**
20+
* @var callable
21+
*/
22+
private $callable;
23+
24+
/**
25+
* @param CallbackSpecificationInterface $callbackSpecification
26+
* @param callable $callable
27+
*/
28+
public function __construct(CallbackSpecificationInterface $callbackSpecification, $callable)
29+
{
30+
$this->specification = $callbackSpecification;
31+
$this->callable = $callable;
32+
}
33+
34+
/**
35+
* @return CallbackSpecificationInterface
36+
*/
37+
public function getSpecification()
38+
{
39+
return $this->specification;
40+
}
41+
42+
/**
43+
* {@inheritDoc}
44+
*/
45+
public function __invoke(TransitionEvent $event)
46+
{
47+
if ($this->specification->isSatisfiedBy($event)) {
48+
$this->call($event->getStateMachine()->getObject(), $event);
49+
}
50+
}
51+
52+
/**
53+
* {@inheritDoc}
54+
*/
55+
protected function call($object, TransitionEvent $event)
56+
{
57+
return call_user_func($this->callable, $object, $event);
58+
}
59+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,163 @@
1+
<?php
2+
3+
namespace Finite\Event\Callback;
4+
5+
use Finite\StateMachine\StateMachineInterface;
6+
7+
/**
8+
* Builds a Callback instance
9+
*
10+
* @author Yohan Giarelli <[email protected]>
11+
*/
12+
class CallbackBuilder
13+
{
14+
/**
15+
* @var StateMachineInterface
16+
*/
17+
private $stateMachine;
18+
19+
/**
20+
* @var array
21+
*/
22+
private $from;
23+
24+
/**
25+
* @var array
26+
*/
27+
private $to;
28+
29+
/**
30+
* @var array
31+
*/
32+
private $on;
33+
34+
/**
35+
* @var callable
36+
*/
37+
private $callable;
38+
39+
/**
40+
* @param StateMachineInterface $sm
41+
* @param array $from
42+
* @param array $to
43+
* @param array $on
44+
* @param callable $callable
45+
*/
46+
public function __construct(StateMachineInterface $sm, array $from = array(), array $to = array(), array $on = array(), $callable = null)
47+
{
48+
$this->stateMachine = $sm;
49+
$this->from = $from;
50+
$this->to = $to;
51+
$this->on = $on;
52+
$this->callable = $callable;
53+
}
54+
55+
/**
56+
* @param array $from
57+
*
58+
* @return CallbackBuilder
59+
*/
60+
public function setFrom(array $from)
61+
{
62+
$this->from = $from;
63+
64+
return $this;
65+
}
66+
67+
/**
68+
* @param array $to
69+
*
70+
* @return CallbackBuilder
71+
*/
72+
public function setTo(array $to)
73+
{
74+
$this->to = $to;
75+
76+
return $this;
77+
}
78+
79+
/**
80+
* @param array $on
81+
*
82+
* @return CallbackBuilder
83+
*/
84+
public function setOn(array $on)
85+
{
86+
$this->on = $on;
87+
88+
return $this;
89+
}
90+
91+
/**
92+
* @param callable $callable
93+
*
94+
* @return CallbackBuilder
95+
*/
96+
public function setCallable($callable)
97+
{
98+
$this->callable = $callable;
99+
100+
return $this;
101+
}
102+
103+
/**
104+
* @param string $from
105+
*
106+
* @return CallbackBuilder
107+
*/
108+
public function addFrom($from)
109+
{
110+
$this->from[] = $from;
111+
112+
return $this;
113+
}
114+
115+
/**
116+
* @param string $to
117+
*
118+
* @return CallbackBuilder
119+
*/
120+
public function addTo($to)
121+
{
122+
$this->to[] = $to;
123+
124+
return $this;
125+
}
126+
127+
/**
128+
* @param string $on
129+
*
130+
* @return CallbackBuilder
131+
*/
132+
public function addOn($on)
133+
{
134+
$this->from[] = $on;
135+
136+
return $this;
137+
}
138+
139+
/**
140+
* @return Callback
141+
*/
142+
public function getCallback()
143+
{
144+
return new Callback(
145+
new CallbackSpecification($this->stateMachine, $this->from, $this->to, $this->on),
146+
$this->callable
147+
);
148+
}
149+
150+
/**
151+
* @param StateMachineInterface $sm
152+
* @param array $from
153+
* @param array $to
154+
* @param array $on
155+
* @param callable $callable
156+
*
157+
* @return CallbackBuilder
158+
*/
159+
public static function create(StateMachineInterface $sm, array $from = array(), array $to = array(), array $on = array(), $callable = null)
160+
{
161+
return new self($sm, $from, $to, $on, $callable);
162+
}
163+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?php
2+
3+
namespace Finite\Event\Callback;
4+
5+
use Finite\StateMachine\StateMachineInterface;
6+
7+
/**
8+
* Concrete implementation of CallbackBuilder factory
9+
*
10+
* @author Yohan Giarelli <[email protected]>
11+
*/
12+
class CallbackBuilderFactory implements CallbackBuilderFactoryInterface
13+
{
14+
/**
15+
* {@inheritDoc}
16+
*/
17+
public function createBuilder(StateMachineInterface $stateMachine)
18+
{
19+
return CallbackBuilder::create($stateMachine);
20+
}
21+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<?php
2+
3+
namespace Finite\Event\Callback;
4+
5+
use Finite\StateMachine\StateMachineInterface;
6+
7+
/**
8+
* Base interface for CallbackBuilder factories
9+
*
10+
* @author Yohan Giarelli <[email protected]>
11+
*/
12+
interface CallbackBuilderFactoryInterface
13+
{
14+
/**
15+
* @param StateMachineInterface $stateMachine
16+
*
17+
* @return mixed
18+
*/
19+
public function createBuilder(StateMachineInterface $stateMachine);
20+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<?php
2+
3+
namespace Finite\Event\Callback;
4+
5+
use Finite\Event\TransitionEvent;
6+
7+
/**
8+
* Base interface for callbacks
9+
*
10+
* @author Yohan Giarelli <[email protected]>
11+
*/
12+
interface CallbackInterface
13+
{
14+
/**
15+
* @param TransitionEvent $event
16+
*/
17+
public function __invoke(TransitionEvent $event);
18+
}

0 commit comments

Comments
 (0)