Skip to content

Commit 9dd1210

Browse files
author
janvt
authored
Merge pull request #21 from geekcell/feat/maker-command
Maker Command - Command
2 parents bb4c467 + 6f2e293 commit 9dd1210

File tree

6 files changed

+250
-98
lines changed

6 files changed

+250
-98
lines changed

config/services.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,11 @@ services:
3030
tags:
3131
- { name: maker.command }
3232

33+
GeekCell\DddBundle\Maker\MakeCommand:
34+
class: GeekCell\DddBundle\Maker\MakeCommand
35+
tags:
36+
- { name: maker.command }
37+
3338
GeekCell\DddBundle\Maker\Doctrine\DoctrineConfigUpdater:
3439
class: GeekCell\DddBundle\Maker\Doctrine\DoctrineConfigUpdater
3540
public: false
Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace GeekCell\DddBundle\Maker;
6+
7+
use Symfony\Bundle\MakerBundle\InputConfiguration;
8+
use Symfony\Bundle\MakerBundle\DependencyBuilder;
9+
use Symfony\Bundle\MakerBundle\ConsoleStyle;
10+
use Symfony\Bundle\MakerBundle\Generator;
11+
use Symfony\Bundle\MakerBundle\InputAwareMakerInterface;
12+
use Symfony\Bundle\MakerBundle\Maker\AbstractMaker;
13+
use Symfony\Bundle\MakerBundle\Util\ClassNameDetails;
14+
use Symfony\Bundle\MakerBundle\Util\UseStatementGenerator;
15+
use Symfony\Component\Console\Command\Command;
16+
use Symfony\Component\Console\Input\InputArgument;
17+
use Symfony\Component\Console\Input\InputInterface;
18+
19+
abstract class AbstractBaseMakeQueryCommand extends AbstractMaker implements InputAwareMakerInterface
20+
{
21+
/**
22+
* Should return the target for the extending command (query|command)
23+
* @return string
24+
*/
25+
abstract function getTarget(): string;
26+
27+
/**
28+
* Should return an array of classes to import when generating the entity
29+
* @return string[]
30+
*/
31+
abstract function getEntityUseStatements(): array;
32+
33+
/**
34+
* Should return an array of classes to import when generating the entity handler
35+
* @return string[]
36+
*/
37+
abstract function getEntityHandlerUseStatements(): array;
38+
39+
/**
40+
* @return string
41+
*/
42+
function getClassSuffix(): string
43+
{
44+
return ucfirst($this->getTarget());
45+
}
46+
47+
/**
48+
* @return string
49+
*/
50+
function getNamespacePrefix(): string
51+
{
52+
return 'Application\\' . $this->getClassSuffix() . '\\';
53+
}
54+
55+
/**
56+
* @inheritDoc
57+
*/
58+
public function configureCommand(Command $command, InputConfiguration $inputConfig): void
59+
{
60+
$command
61+
->addArgument(
62+
'name',
63+
InputArgument::REQUIRED,
64+
'The name of the ' . $this->getTarget() . ' class (e.g. <fg=yellow>Customer</>)',
65+
)
66+
;
67+
}
68+
69+
/**
70+
* @inheritDoc
71+
*/
72+
public function configureDependencies(DependencyBuilder $dependencies, InputInterface $input = null): void
73+
{
74+
}
75+
76+
/**
77+
* @inheritDoc
78+
*/
79+
public function interact(InputInterface $input, ConsoleStyle $io, Command $command): void
80+
{
81+
}
82+
83+
/**
84+
* @inheritDoc
85+
*/
86+
public function generate(InputInterface $input, ConsoleStyle $io, Generator $generator): void
87+
{
88+
$entityClassNameDetails = $generator->createClassNameDetails(
89+
$input->getArgument('name'),
90+
$this->getNamespacePrefix(),
91+
$this->getClassSuffix(),
92+
);
93+
94+
$this->generateEntity($entityClassNameDetails, $generator);
95+
$this->generateHandler($entityClassNameDetails, $generator);
96+
97+
$this->writeSuccessMessage($io);
98+
}
99+
100+
/**
101+
* @param ClassNameDetails $queryClassNameDetails
102+
* @param Generator $generator
103+
* @return void
104+
*/
105+
private function generateEntity(ClassNameDetails $queryClassNameDetails, Generator $generator): void
106+
{
107+
$templateVars = [
108+
'use_statements' => new UseStatementGenerator($this->getEntityUseStatements()),
109+
];
110+
111+
$templatePath = __DIR__."/../Resources/skeleton/{$this->getTarget()}/{$this->getClassSuffix()}.tpl.php";
112+
$generator->generateClass(
113+
$queryClassNameDetails->getFullName(),
114+
$templatePath,
115+
$templateVars,
116+
);
117+
118+
$generator->writeChanges();
119+
}
120+
121+
/**
122+
* @param ClassNameDetails $queryClassNameDetails
123+
* @param Generator $generator
124+
* @return void
125+
*/
126+
private function generateHandler(ClassNameDetails $queryClassNameDetails, Generator $generator): void
127+
{
128+
$classNameDetails = $generator->createClassNameDetails(
129+
$queryClassNameDetails->getShortName(),
130+
$this->getNamespacePrefix(),
131+
'Handler',
132+
);
133+
134+
$templateVars = [
135+
'use_statements' => new UseStatementGenerator($this->getEntityHandlerUseStatements()),
136+
'query_class_name' => $queryClassNameDetails->getShortName()
137+
];
138+
139+
$templatePath = __DIR__."/../Resources/skeleton/{$this->getTarget()}/{$this->getClassSuffix()}Handler.tpl.php";
140+
$generator->generateClass(
141+
$classNameDetails->getFullName(),
142+
$templatePath,
143+
$templateVars,
144+
);
145+
146+
$generator->writeChanges();
147+
}
148+
}

src/Maker/MakeCommand.php

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace GeekCell\DddBundle\Maker;
6+
7+
use GeekCell\Ddd\Contracts\Application\Command;
8+
use GeekCell\Ddd\Contracts\Application\CommandHandler;
9+
use GeekCell\Ddd\Domain\Collection;
10+
use Symfony\Component\Messenger\Attribute\AsMessageHandler;
11+
12+
final class MakeCommand extends AbstractBaseMakeQueryCommand
13+
{
14+
const TARGET = 'command';
15+
16+
/**
17+
* @inheritDoc
18+
*/
19+
public static function getCommandName(): string
20+
{
21+
return 'make:ddd:' . self::TARGET;
22+
}
23+
24+
/**
25+
* @inheritDoc
26+
*/
27+
public static function getCommandDescription(): string
28+
{
29+
return 'Creates a new ' . self::TARGET . ' class and handler';
30+
}
31+
32+
/**
33+
* @inheritDoc
34+
*/
35+
function getTarget(): string
36+
{
37+
return self::TARGET;
38+
}
39+
40+
/**
41+
* @inheritDoc
42+
*/
43+
function getEntityUseStatements(): array
44+
{
45+
return [
46+
Command::class
47+
];
48+
}
49+
50+
/**
51+
* @inheritDoc
52+
*/
53+
function getEntityHandlerUseStatements(): array
54+
{
55+
return [
56+
CommandHandler::class,
57+
AsMessageHandler::class
58+
];
59+
}
60+
}

src/Maker/MakeQuery.php

Lines changed: 15 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -7,138 +7,55 @@
77
use GeekCell\Ddd\Contracts\Application\Query;
88
use GeekCell\Ddd\Contracts\Application\QueryHandler;
99
use GeekCell\Ddd\Domain\Collection;
10-
use Symfony\Bundle\MakerBundle\InputConfiguration;
11-
use Symfony\Bundle\MakerBundle\DependencyBuilder;
12-
use Symfony\Bundle\MakerBundle\ConsoleStyle;
13-
use Symfony\Bundle\MakerBundle\Generator;
14-
use Symfony\Bundle\MakerBundle\InputAwareMakerInterface;
15-
use Symfony\Bundle\MakerBundle\Maker\AbstractMaker;
16-
use Symfony\Bundle\MakerBundle\Util\ClassNameDetails;
17-
use Symfony\Bundle\MakerBundle\Util\UseStatementGenerator;
18-
use Symfony\Component\Console\Command\Command;
19-
use Symfony\Component\Console\Input\InputArgument;
20-
use Symfony\Component\Console\Input\InputInterface;
2110
use Symfony\Component\Messenger\Attribute\AsMessageHandler;
2211

23-
const NAMESPACE_PREFIX = 'Application\\Query\\';
24-
25-
final class MakeQuery extends AbstractMaker implements InputAwareMakerInterface
12+
final class MakeQuery extends AbstractBaseMakeQueryCommand
2613
{
27-
public function __construct() {}
14+
const TARGET = 'query';
2815

2916
/**
3017
* @inheritDoc
3118
*/
3219
public static function getCommandName(): string
3320
{
34-
return 'make:ddd:query';
21+
return 'make:ddd:' . self::TARGET;
3522
}
3623

3724
/**
3825
* @inheritDoc
3926
*/
4027
public static function getCommandDescription(): string
4128
{
42-
return 'Creates a new query class and handler';
43-
}
44-
45-
/**
46-
* @inheritDoc
47-
*/
48-
public function configureCommand(Command $command, InputConfiguration $inputConfig): void
49-
{
50-
$command
51-
->addArgument(
52-
'name',
53-
InputArgument::REQUIRED,
54-
'The name of the query class (e.g. <fg=yellow>Customer</>)',
55-
)
56-
;
57-
}
58-
59-
/**
60-
* @inheritDoc
61-
*/
62-
public function configureDependencies(DependencyBuilder $dependencies, InputInterface $input = null): void
63-
{
29+
return 'Creates a new ' . self::TARGET . ' class and handler';
6430
}
6531

6632
/**
6733
* @inheritDoc
6834
*/
69-
public function interact(InputInterface $input, ConsoleStyle $io, Command $command): void
35+
function getTarget(): string
7036
{
37+
return self::TARGET;
7138
}
7239

7340
/**
7441
* @inheritDoc
7542
*/
76-
public function generate(InputInterface $input, ConsoleStyle $io, Generator $generator): void
43+
function getEntityUseStatements(): array
7744
{
78-
$queryClassNameDetails = $generator->createClassNameDetails(
79-
$input->getArgument('name'),
80-
NAMESPACE_PREFIX,
81-
'Query',
82-
);
83-
84-
$this->generateQuery($queryClassNameDetails, $generator);
85-
$this->generateQueryHandler($queryClassNameDetails, $generator);
86-
87-
$this->writeSuccessMessage($io);
88-
}
89-
90-
/**
91-
* @param ClassNameDetails $queryClassNameDetails
92-
* @param Generator $generator
93-
* @return void
94-
*/
95-
private function generateQuery(ClassNameDetails $queryClassNameDetails, Generator $generator): void
96-
{
97-
$templateVars = [
98-
'use_statements' => new UseStatementGenerator([
99-
Query::class,
100-
]),
45+
return [
46+
Query::class
10147
];
102-
103-
$templatePath = __DIR__.'/../Resources/skeleton/query/Query.tpl.php';
104-
$generator->generateClass(
105-
$queryClassNameDetails->getFullName(),
106-
$templatePath,
107-
$templateVars,
108-
);
109-
110-
$generator->writeChanges();
11148
}
11249

11350
/**
114-
* @param ClassNameDetails $queryClassNameDetails
115-
* @param Generator $generator
116-
* @return void
51+
* @inheritDoc
11752
*/
118-
private function generateQueryHandler(ClassNameDetails $queryClassNameDetails, Generator $generator): void
53+
function getEntityHandlerUseStatements(): array
11954
{
120-
$classNameDetails = $generator->createClassNameDetails(
121-
$queryClassNameDetails->getShortName(),
122-
NAMESPACE_PREFIX,
123-
'Handler',
124-
);
125-
126-
$templateVars = [
127-
'use_statements' => new UseStatementGenerator([
128-
QueryHandler::class,
129-
Collection::class,
130-
AsMessageHandler::class
131-
]),
132-
'query_class_name' => $queryClassNameDetails->getShortName()
55+
return [
56+
QueryHandler::class,
57+
Collection::class,
58+
AsMessageHandler::class
13359
];
134-
135-
$templatePath = __DIR__.'/../Resources/skeleton/query/QueryHandler.tpl.php';
136-
$generator->generateClass(
137-
$classNameDetails->getFullName(),
138-
$templatePath,
139-
$templateVars,
140-
);
141-
142-
$generator->writeChanges();
14360
}
14461
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?= "<?php\n" ?>
2+
3+
namespace <?= $namespace; ?>;
4+
5+
<?= $use_statements ?>
6+
7+
class <?= $class_name ?> implements Command
8+
{
9+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?= "<?php\n" ?>
2+
3+
namespace <?= $namespace; ?>;
4+
5+
<?= $use_statements ?>
6+
7+
#[AsMessageHandler]
8+
class <?= $class_name ?> implements CommandHandler
9+
{
10+
public function __invoke(<?= $query_class_name ?> $query): void
11+
{
12+
}
13+
}

0 commit comments

Comments
 (0)