9
9
use PhpSchool \PhpWorkshop \Command \CreditsCommand ;
10
10
use PhpSchool \PhpWorkshop \Command \HelpCommand ;
11
11
use PhpSchool \PhpWorkshop \Command \MenuCommandInvoker ;
12
+ use PhpSchool \PhpWorkshop \Event \Event ;
13
+ use PhpSchool \PhpWorkshop \Event \EventDispatcher ;
14
+ use PhpSchool \PhpWorkshop \Exercise \AbstractExercise ;
12
15
use PhpSchool \PhpWorkshop \Exercise \ExerciseInterface ;
13
16
use PhpSchool \PhpWorkshop \ExerciseRenderer ;
14
17
use PhpSchool \PhpWorkshop \ExerciseRepository ;
@@ -34,6 +37,7 @@ public function __invoke(ContainerInterface $c)
34
37
$ userState = $ userStateSerializer ->deSerialize ();
35
38
$ exerciseRenderer = $ c ->get (ExerciseRenderer::class);
36
39
$ workshopType = $ c ->get (WorkshopType::class);
40
+ $ eventDispatcher = $ c ->get (EventDispatcher::class);
37
41
38
42
$ builder = (new CliMenuBuilder )
39
43
->addLineBreak ();
@@ -48,9 +52,13 @@ public function __invoke(ContainerInterface $c)
48
52
->addStaticItem ('Exercises ' )
49
53
->addStaticItem ('--------- ' )
50
54
->addItems (
51
- array_map (function (ExerciseInterface $ exercise ) use ($ exerciseRenderer , $ userState , $ workshopType ) {
55
+ array_map (function (ExerciseInterface $ exercise ) use ($ exerciseRenderer , $ userState , $ workshopType, $ eventDispatcher ) {
52
56
return [
53
57
$ exercise ->getName (),
58
+ function (CliMenu $ menu ) use ($ exerciseRenderer , $ eventDispatcher , $ exercise ) {
59
+ $ this ->dispatchExerciseSelectedEvent ($ eventDispatcher , $ exercise );
60
+ $ exerciseRenderer ->__invoke ($ menu );
61
+ },
54
62
$ exerciseRenderer ,
55
63
$ userState ->completedExercise ($ exercise ->getName ()),
56
64
$ this ->isExerciseDisabled ($ exercise , $ userState , $ workshopType )
@@ -121,4 +129,20 @@ private function isExerciseDisabled(ExerciseInterface $exercise, UserState $user
121
129
$ previous = $ exercise ;
122
130
return true ;
123
131
}
132
+
133
+ /**
134
+ * @param EventDispatcher $eventDispatcher
135
+ * @param ExerciseInterface $exercise
136
+ */
137
+ private function dispatchExerciseSelectedEvent (EventDispatcher $ eventDispatcher , ExerciseInterface $ exercise )
138
+ {
139
+ $ eventDispatcher ->dispatch (
140
+ new Event (
141
+ sprintf (
142
+ 'exercise.selected.%s ' ,
143
+ AbstractExercise::normaliseName ($ exercise ->getName ())
144
+ )
145
+ )
146
+ );
147
+ }
124
148
}
0 commit comments