8000 feature #1579 [make:listener] Match event name against active events … · symfony/maker-bundle@ba37c4f · GitHub
[go: up one dir, main page]

Skip to content

Commit ba37c4f

Browse files
feature #1579 [make:listener] Match event name against active events class/id
* Match event name against Event classes/id * fix: CS fixes after review
1 parent d4e0685 commit ba37c4f

File tree

3 files changed

+124
-0
lines changed

3 files changed

+124
-0
lines changed

src/Maker/MakeListener.php

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
use Symfony\Component\Console\Input\InputArgument;
2424
use Symfony\Component\Console\Input\InputInterface;
2525
use Symfony\Component\Console\Question\ChoiceQuestion;
26+
use Symfony\Component\Console\Question\ConfirmationQuestion;
2627
use Symfony\Component\Console\Question\Question;
2728
use Symfony\Component\EventDispatcher\Attribute\AsEventListener;
2829
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
@@ -102,6 +103,38 @@ public function interact(InputInterface $input, ConsoleStyle $io, Command $comma
102103
$event = $io->askQuestion($question);
103104
$input->setArgument('event', $event);
104105
}
106+
107+
$event = $input->getArgument('event');
108+
if (null === $this->getEventConstant($event) && null === $this->eventRegistry->getEventClassName($event)) {
109+
$eventList = $this->eventRegistry->getAllActiveEvents();
110+
$eventFQCNList = array_filter(array_map($this->eventRegistry->getEventClassName(...), $eventList), fn ($eventFQCN) => \is_string($eventFQCN));
111+
$eventIdAndFQCNList = array_unique(array_merge($eventList, $eventFQCNList));
112+
$suggestionList = [];
113+
114+
foreach ($eventIdAndFQCNList as $eventSuggestion) {
115+
if (levenshtein($event, Str::getShortClassName($eventSuggestion)) < 3) {
116+
$suggestionList[] = $eventSuggestion;
117+
}
118+
}
119+
120+
if (!$suggestionList) {
121+
return;
122+
}
123+
124+
if (1 === \count($suggestionList)) {
125+
$question = new ConfirmationQuestion(\sprintf('<fg=green>Did you mean</> <fg=yellow>"%s"</> <fg=green>?</>', $suggestionList[0]), false);
126+
$input->setArgument('event', $io->askQuestion($question) ? $suggestionList[0] : $event);
127+
128+
return;
129+
}
130+
131+
$io->writeln(' <fg=yellow>Did you mean one of these events?</>');
132+
$io->listing($suggestionList);
133+
$question = new Question(\sprintf(' <fg=green>%s</>', $command->getDefinition()->getArgument('event')->getDescription()), $event);
134+
$question->setAutocompleterValues(array_merge($suggestionList, [$event]));
135+
136+
$input->setArgument('event', $io->askQuestion($question));
137+
}
105138
}
106139

107140
public function generate(InputInterface $input, ConsoleStyle $io, Generator $generator): void

tests/Maker/MakeListenerTest.php

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,82 @@ public function getTestDetails(): \Generator
167167
);
168168
}),
169169
];
170+
171+
yield 'it_makes_listener_for_known_event_by_id' => [$this->createMakerTest()
172+
->run(function (MakerTestRunner $runner) {
173+
$runner->runMaker(
174+
[
175+
// listener name
176+
'FooListener',
177+
// event name
178+
'kernel.request',
179+
// accept the suggestion
180+
'y',
181+
]
182+
);
183+
self::assertFileEquals(
184+
self::EXPECTED_LISTENER_PATH.'FooListener.php',
185+
$runner->getPath('src/EventListener/FooListener.php')
186+
);
187+
}),
188+
];
189+
190+
yield 'it_makes_listener_for_known_event_by_short_class_name' => [$this->createMakerTest()
191+
->run(function (MakerTestRunner $runner) {
192+
$runner->runMaker(
193+
[
194+
// listener name
195+
'BarListener',
196+
// event name
197+
'RequestEvent',
198+
// accept the suggestion
199+
'y',
200+
]
201+
);
202+
self::assertFileEquals(
203+
self::EXPECTED_LISTENER_PATH.'BarListener.php',
204+
$runner->getPath('src/EventListener/BarListener.php')
205+
);
206+
}),
207+
];
208+
209+
yield 'it_makes_listener_for_known_event_by_id_with_2_letters_typo' => [$this->createMakerTest()
210+
->run(function (MakerTestRunner $runner) {
211+
$runner->runMaker(
212+
[
213+
// listener name
214+
'FooListener',
215+
// event name
216+
'kernem.reques',
217+
// accept the suggestion
218+
'y',
219+
]
220+
);
221+
self::assertFileEquals(
222+
self::EXPECTED_LISTENER_PATH.'FooListener.php',
223+
$runner->getPath('src/EventListener/FooListener.php')
224+
);
225+
}),
226+
];
227+
228+
yield 'it_makes_listener_for_known_event_by_short_class_name_with_2_letters_typo' => [$this->createMakerTest()
229+
->run(function (MakerTestRunner $runner) {
230+
$runner->runMaker(
231+
[
232+
// listener name
233+
'BarListener',
234+
// event name
235+
'RequstEveny',
236+
// accept the suggestion
237+
'y',
238+
]
239+
);
240+
self::assertFileEquals(
241+
self::EXPECTED_LISTENER_PATH.'BarListener.php',
242+
$runner->getPath('src/EventListener/BarListener.php')
243+
);
244+
}),
245+
];
170246
}
171247

172248
protected function getMakerClass(): string
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?php
2+
3+
namespace App\EventListener;
4+
5+
use Symfony\Component\EventDispatcher\Attribute\AsEventListener;
6+
use Symfony\Component\HttpKernel\Event\RequestEvent;
7+
8+
final class BarListener
9+
{
10+
#[AsEventListener(event: RequestEvent::class)]
11+
public function onRequestEvent(RequestEvent $event): void
12+
{
13+
// ...
14+
}
15+
}

0 commit comments

Comments
 (0)
0