Skip to content

Commit 1ec03c3

Browse files
committed
Dispatch event when an exercise is selected
1 parent 79aef98 commit 1ec03c3

File tree

3 files changed

+31
-5
lines changed

3 files changed

+31
-5
lines changed

src/Exercise/AbstractExercise.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ public function getSolution()
4141
sprintf(
4242
'%s/../../exercises/%s/solution/solution.php',
4343
dirname((new ReflectionClass(static::class))->getFileName()),
44-
$this->normaliseName($this->getName())
44+
self::normaliseName($this->getName())
4545
)
4646
)
4747
);
@@ -55,7 +55,7 @@ public function getSolution()
5555
*/
5656
public function getProblem()
5757
{
58-
$name = $this->normaliseName($this->getName());
58+
$name = self::normaliseName($this->getName());
5959
$dir = dirname((new ReflectionClass(static::class))->getFileName());
6060
return sprintf('%s/../../exercises/%s/problem/problem.md', $dir, $name);
6161
}
@@ -74,7 +74,7 @@ public function tearDown()
7474
* @param string $name
7575
* @return string
7676
*/
77-
private function normaliseName($name)
77+
public static function normaliseName($name)
7878
{
7979
return preg_replace('/[^A-Za-z\-]+/', '', str_replace(' ', '-', strtolower($name)));
8080
}

src/Factory/MenuFactory.php

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@
99
use PhpSchool\PhpWorkshop\Command\CreditsCommand;
1010
use PhpSchool\PhpWorkshop\Command\HelpCommand;
1111
use PhpSchool\PhpWorkshop\Command\MenuCommandInvoker;
12+
use PhpSchool\PhpWorkshop\Event\Event;
13+
use PhpSchool\PhpWorkshop\Event\EventDispatcher;
14+
use PhpSchool\PhpWorkshop\Exercise\AbstractExercise;
1215
use PhpSchool\PhpWorkshop\Exercise\ExerciseInterface;
1316
use PhpSchool\PhpWorkshop\ExerciseRenderer;
1417
use 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
}

test/Factory/MenuFactoryTest.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
use PhpSchool\CliMenu\CliMenu;
77
use PhpSchool\PhpWorkshop\Command\CreditsCommand;
88
use PhpSchool\PhpWorkshop\Command\HelpCommand;
9+
use PhpSchool\PhpWorkshop\Event\EventDispatcher;
910
use PhpSchool\PhpWorkshop\Exercise\ExerciseInterface;
1011
use PhpSchool\PhpWorkshop\ExerciseRenderer;
1112
use PhpSchool\PhpWorkshop\ExerciseRepository;
@@ -53,7 +54,8 @@ public function testFactoryReturnsInstance()
5354
'bgColour' => 'black',
5455
'fgColour' => 'green',
5556
'workshopTitle' => 'TITLE',
56-
WorkshopType::class => WorkshopType::STANDARD()
57+
WorkshopType::class => WorkshopType::STANDARD(),
58+
EventDispatcher::class => $this->createMock(EventDispatcher::class),
5759
];
5860

5961
$container

0 commit comments

Comments
 (0)