Skip to content

Commit 9e0e042

Browse files
committed
use config to create final webhook classes
1 parent 0624f13 commit 9e0e042

File tree

4 files changed

+71
-41
lines changed

4 files changed

+71
-41
lines changed

src/Maker/MakeWebhook.php

Lines changed: 35 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,7 @@
1919
use Symfony\Bundle\MakerBundle\InputAwareMakerInterface;
2020
use Symfony\Bundle\MakerBundle\InputConfiguration;
2121
use Symfony\Bundle\MakerBundle\Maker\Common\InstallDependencyTrait;
22-
use Symfony\Bundle\MakerBundle\Str;
23-
use Symfony\Bundle\MakerBundle\Util\ClassNameDetails;
24-
use Symfony\Bundle\MakerBundle\Util\UseStatementGenerator;
22+
use Symfony\Bundle\MakerBundle\Util\ClassSource\Model\ClassData;
2523
use Symfony\Bundle\MakerBundle\Util\YamlSourceManipulator;
2624
use Symfony\Bundle\MakerBundle\Validator;
2725
use Symfony\Component\Console\Command\Command;
@@ -146,21 +144,37 @@ public function interact(InputInterface $input, ConsoleStyle $io, Command $comma
146144

147145
public function generate(InputInterface $input, ConsoleStyle $io, Generator $generator): void
148146
{
149-
$requestParserDetails = $this->generator->createClassNameDetails(
150-
Str::asClassName($this->name.'RequestParser'),
151-
'Webhook\\'
147+
$requestParserClassData = ClassData::create(
148+
class: \sprintf('Webhook\\%s', $input->getArgument('name')),
149+
suffix: 'RequestParser',
150+
extendsClass: AbstractRequestParser::class,
151+
useStatements: [
152+
JsonException::class,
153+
Request::class,
154+
Response::class,
155+
RemoteEvent::class,
156+
AbstractRequestParser::class,
157+
RejectWebhookException::class,
158+
RequestMatcherInterface::class,
159+
],
152160
);
153-
$remoteEventConsumerDetails = $this->generator->createClassNameDetails(
154-
Str::asClassName($this->name.'WebhookConsumer'),
155-
'RemoteEvent\\'
161+
162+
$remoteEventClassData = ClassData::create(
163+
class: \sprintf('RemoteEvent\\%s', $input->getArgument('name')),
164+
suffix: 'WebhookConsumer',
165+
useStatements: [
166+
AsRemoteEventConsumer::class,
167+
ConsumerInterface::class,
168+
RemoteEvent::class,
169+
],
156170
);
157171

158-
$this->addToYamlConfig($this->name, $requestParserDetails);
172+
$this->addToYamlConfig($this->name, $requestParserClassData);
159173

160-
$this->generateRequestParser(requestParserDetails: $requestParserDetails);
174+
$this->generateRequestParser($requestParserClassData);
161175

162-
$this->generator->generateClass(
163-
$remoteEventConsumerDetails->getFullName(),
176+
$this->generator->generateClassFromClassData(
177+
$remoteEventClassData,
164178
'webhook/WebhookConsumer.tpl.php',
165179
[
166180
'webhook_name' => $this->name,
@@ -178,7 +192,7 @@ private function verifyWebhookName(string $entityName): bool
178192
return preg_match(self::WEBHOOK_NAME_PATTERN, $entityName);
179193
}
180194

181-
private function addToYamlConfig(string $webhookName, ClassNameDetails $requestParserDetails): void
195+
private function addToYamlConfig(string $webhookName, ClassData $requestParserClassData): void
182196
{
183197
$yamlConfig = Yaml::dump(['framework' => ['webhook' => ['routing' => []]]], 4, 2);
184198
if ($this->fileManager->fileExists(self::WEBHOOK_CONFIG_PATH)) {
@@ -193,7 +207,7 @@ private function addToYamlConfig(string $webhookName, ClassNameDetails $requestP
193207
}
194208

195209
$arrayConfig['framework']['webhook']['routing'][$webhookName] = [
196-
'service' => $requestParserDetails->getFullName(),
210+
'service' => $requestParserClassData->getFullClassName(),
197211
'secret' => 'your_secret_here',
198212
];
199213
$this->ysm->setData(
@@ -204,43 +218,31 @@ private function addToYamlConfig(string $webhookName, ClassNameDetails $requestP
204218
/**
205219
* @throws \Exception
206220
*/
207-
private function generateRequestParser(ClassNameDetails $requestParserDetails): void
221+
private function generateRequestParser(ClassData $requestParserClassData): void
208222
{
209-
$useStatements = new UseStatementGenerator([
210-
JsonException::class,
211-
Request::class,
212-
Response::class,
213-
RemoteEvent::class,
214-
AbstractRequestParser::class,
215-
RejectWebhookException::class,
216-
RequestMatcherInterface::class,
217-
]);
218-
219223
// Use a ChainRequestMatcher if multiple matchers have been added OR if none (will be printed with an empty array)
220224
$useChainRequestsMatcher = false;
221225

222226
if (1 !== \count($this->requestMatchers)) {
223227
$useChainRequestsMatcher = true;
224-
$useStatements->addUseStatement(ChainRequestMatcher::class);
228+
$requestParserClassData->addUseStatement(ChainRequestMatcher::class);
225229
}
226230

227231
$requestMatcherArguments = [];
228232

229233
foreach ($this->requestMatchers as $requestMatcherClass) {
230-
$useStatements->addUseStatement($requestMatcherClass);
234+
$requestParserClassData->addUseStatement($requestMatcherClass);
231235
$requestMatcherArguments[$requestMatcherClass] = $this->getRequestMatcherArguments(requestMatcherClass: $requestMatcherClass);
232236

233237
if (ExpressionRequestMatcher::class === $requestMatcherClass) {
234-
$useStatements->addUseStatement(Expression::class);
235-
$useStatements->addUseStatement(ExpressionLanguage::class);
238+
$requestParserClassData->addUseStatement([Expression::class, ExpressionLanguage::class]);
236239
}
237240
}
238241

239-
$this->generator->generateClass(
240-
$requestParserDetails->getFullName(),
242+
$this->generator->generateClassFromClassData(
243+
$requestParserClassData,
241244
'webhook/RequestParser.tpl.php',
242245
[
243-
'use_statements' => $useStatements,
244246
'use_chained_requests_matcher' => $useChainRequestsMatcher,
245247
'request_matchers' => $this->requestMatchers,
246248
'request_matcher_arguments' => $requestMatcherArguments,

templates/webhook/RequestParser.tpl.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
<?= "<?php\n" ?>
22

3-
namespace <?= $namespace; ?>;
3+
namespace <?= $class_data->getNamespace(); ?>;
44

5-
<?= $use_statements; ?>
5+
<?= $class_data->getUseStatements(); ?>
66

7-
final class <?= $class_name ?> extends AbstractRequestParser
7+
<?= $class_data->getClassDeclaration(); ?>
88
{
99
protected function getRequestMatcher(): RequestMatcherInterface
1010
{

templates/webhook/WebhookConsumer.tpl.php

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
11
<?= "<?php\n" ?>
22

3-
namespace <?= $namespace; ?>;
3+
namespace <?= $class_data->getNamespace(); ?>;
44

5-
use Symfony\Component\RemoteEvent\Attribute\AsRemoteEventConsumer;
6-
use Symfony\Component\RemoteEvent\Consumer\ConsumerInterface;
7-
use Symfony\Component\RemoteEvent\RemoteEvent;
5+
<?= $class_data->getUseStatements(); ?>
86

97
#[AsRemoteEventConsumer('<?= $webhook_name ?>')]
10-
final class <?= $class_name ?> implements ConsumerInterface
8+
<?= $class_data->getClassDeclaration(); ?> implements ConsumerInterface
119
{
1210
public function __construct()
1311
{

tests/Maker/MakeWebhookTest.php

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
use Symfony\Bundle\MakerBundle\Maker\MakeWebhook;
1515
use Symfony\Bundle\MakerBundle\Test\MakerTestCase;
1616
use Symfony\Bundle\MakerBundle\Test\MakerTestRunner;
17+
use Symfony\Component\Yaml\Yaml;
1718

1819
class MakeWebhookTest extends MakerTestCase
1920
{
@@ -270,5 +271,34 @@ public function getTestDetails(): \Generator
270271
);
271272
}),
272273
];
274+
275+
yield 'it_makes_webhook_not_final' => [$this->createMakerTest()
276+
->run(function (MakerTestRunner $runner) {
277+
$runner->writeFile(
278+
'config/packages/dev/maker.yaml',
279+
Yaml::dump(['when@dev' => ['maker' => ['generate_final_classes' => false]]])
280+
);
281+
282+
$runner->runMaker(
283+
[
284+
'remote_service',
285+
'',
286+
]
287+
);
288+
289+
$outputExpectations = [
290+
'src/Webhook/RemoteServiceRequestParser.php' => 'class RemoteServiceRequestParser extends AbstractRequestParser;',
291+
'src/RemoteEvent/RemoteServiceWebhookConsumer.php' => 'class RemoteServiceWebhookConsumer implements ConsumerInterface',
292+
];
293+
294+
foreach ($outputExpectations as $expectedFileName => $expectedContent) {
295+
$path = $runner->getPath($expectedFileName);
296+
297+
$this->assertFileExists($runner->getPath($expectedFileName));
298+
$this->assertStringNotContainsString('final', file_get_contents($path));
299+
$this->assertStringContainsString($expectedContent, file_get_contents($path));
300+
}
301+
}),
302+
];
273303
}
274304
}

0 commit comments

Comments
 (0)