Skip to content

Commit

Permalink
feature #940 [make:subscriber] Improve MakeSubscriber to use KernelEv…
Browse files Browse the repository at this point in the history
…ents constant instead hardcoded event (bdaler, jrushlow)

This PR was merged into the 1.0-dev branch.

Discussion
----------

[make:subscriber] Improve MakeSubscriber to use KernelEvents constant instead hardcoded event

Use KernelEvents constant instead hardcoded event type in MakeSubscriber.
#744

Commits
-------

f724487 inline extra method
4556854 custom event class
187e0d9 fix assertion
3fa4360 add test case
416e5f4 slight refactoring
648db48 strict typing
37aec4e php-cs-fixer it up
54f3891 use generated use statements
9a397e6 Style fix.
0341a50 Use KernelEvents constant instead hardcoded event type in MakeSubscriber.
  • Loading branch information
weaverryan committed Jul 13, 2022
2 parents 63c52a1 + f724487 commit 8a3de03
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 2 deletions.
22 changes: 21 additions & 1 deletion src/Maker/MakeSubscriber.php
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Question\Question;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\KernelEvents;

/**
* @author Javier Eguiluz <javier.eguiluz@gmail.com>
Expand Down Expand Up @@ -87,6 +88,14 @@ public function generate(InputInterface $input, ConsoleStyle $io, Generator $gen
EventSubscriberInterface::class,
]);

// Determine if we use a KernelEvents::CONSTANT or custom even name
if (null !== ($eventConstant = $this->getEventConstant($event))) {
$useStatements->addUseStatement(KernelEvents::class);
$eventName = $eventConstant;
} else {
$eventName = class_exists($event) ? sprintf('%s::class', $eventClassName) : sprintf('\'%s\'', $event);
}

if (null !== $eventFullClassName) {
$useStatements->addUseStatement($eventFullClassName);
}
Expand All @@ -96,7 +105,7 @@ public function generate(InputInterface $input, ConsoleStyle $io, Generator $gen
'event/Subscriber.tpl.php',
[
'use_statements' => $useStatements,
'event' => class_exists($event) ? sprintf('%s::class', $eventClassName) : sprintf('\'%s\'', $event),
'event' => $eventName,
'event_arg' => $eventClassName ? sprintf('%s $event', $eventClassName) : '$event',
'method_name' => class_exists($event) ? Str::asEventMethod($eventClassName) : Str::asEventMethod($event),
]
Expand All @@ -115,4 +124,15 @@ public function generate(InputInterface $input, ConsoleStyle $io, Generator $gen
public function configureDependencies(DependencyBuilder $dependencies): void
{
}

private function getEventConstant(string $event): ?string
{
$constants = (new \ReflectionClass(KernelEvents::class))->getConstants();

if (false !== ($name = array_search($event, $constants, true))) {
return sprintf('KernelEvents::%s', $name);
}

return null;
}
}
30 changes: 29 additions & 1 deletion tests/Maker/MakeSubscriberTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ protected function getMakerClass(): string
return MakeSubscriber::class;
}

public function getTestDetails()
public function getTestDetails(): \Generator
{
yield 'it_makes_subscriber_for_known_event' => [$this->createMakerTest()
->run(function (MakerTestRunner $runner) {
Expand All @@ -34,6 +34,29 @@ public function getTestDetails()
'kernel.request',
]
);

self::assertStringContainsString(
'KernelEvents::REQUEST => \'onKernelRequest\'',
file_get_contents($runner->getPath('src/EventSubscriber/FooBarSubscriber.php'))
);
}),
];

yield 'it_makes_subscriber_for_custom_event_class' => [$this->createMakerTest()
->run(function (MakerTestRunner $runner) {
$runner->runMaker(
[
// subscriber name
'FooBar',
// event name
\Symfony\Bundle\MakerBundle\Generator::class,
]
);

self::assertStringContainsString(
'Generator::class => \'onGenerator\'',
file_get_contents($runner->getPath('src/EventSubscriber/FooBarSubscriber.php'))
);
}),
];

Expand All @@ -47,6 +70,11 @@ public function getTestDetails()
'foo.unknown_event',
]
);

self::assertStringContainsString(
'\'foo.unknown_event\' => \'onFooUnknownEvent\',',
file_get_contents($runner->getPath('src/EventSubscriber/FooBarSubscriber.php'))
);
}),
];
}
Expand Down

0 comments on commit 8a3de03

Please sign in to comment.