99use PhpSchool \PhpWorkshop \Command \CreditsCommand ;
1010use PhpSchool \PhpWorkshop \Command \HelpCommand ;
1111use PhpSchool \PhpWorkshop \Command \MenuCommandInvoker ;
12+ use PhpSchool \PhpWorkshop \Event \Event ;
13+ use PhpSchool \PhpWorkshop \Event \EventDispatcher ;
14+ use PhpSchool \PhpWorkshop \Exercise \AbstractExercise ;
1215use PhpSchool \PhpWorkshop \Exercise \ExerciseInterface ;
1316use PhpSchool \PhpWorkshop \ExerciseRenderer ;
1417use PhpSchool \PhpWorkshop \ExerciseRepository ;
@@ -34,6 +37,7 @@ public function __invoke(ContainerInterface $c)
3437 $ userState = $ userStateSerializer ->deSerialize ();
3538 $ exerciseRenderer = $ c ->get (ExerciseRenderer::class);
3639 $ workshopType = $ c ->get (WorkshopType::class);
40+ $ eventDispatcher = $ c ->get (EventDispatcher::class);
3741
3842 $ builder = (new CliMenuBuilder )
3943 ->addLineBreak ();
@@ -48,9 +52,13 @@ public function __invoke(ContainerInterface $c)
4852 ->addStaticItem ('Exercises ' )
4953 ->addStaticItem ('--------- ' )
5054 ->addItems (
51- array_map (function (ExerciseInterface $ exercise ) use ($ exerciseRenderer , $ userState , $ workshopType ) {
55+ array_map (function (ExerciseInterface $ exercise ) use ($ exerciseRenderer , $ userState , $ workshopType, $ eventDispatcher ) {
5256 return [
5357 $ exercise ->getName (),
58+ function (CliMenu $ menu ) use ($ exerciseRenderer , $ eventDispatcher , $ exercise ) {
59+ $ this ->dispatchExerciseSelectedEvent ($ eventDispatcher , $ exercise );
60+ $ exerciseRenderer ->__invoke ($ menu );
61+ },
5462 $ exerciseRenderer ,
5563 $ userState ->completedExercise ($ exercise ->getName ()),
5664 $ this ->isExerciseDisabled ($ exercise , $ userState , $ workshopType )
@@ -121,4 +129,20 @@ private function isExerciseDisabled(ExerciseInterface $exercise, UserState $user
121129 $ previous = $ exercise ;
122130 return true ;
123131 }
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+ }
124148}
0 commit comments