Skip to content
This repository was archived by the owner on Oct 28, 2025. It is now read-only.

Commit bb4c467

Browse files
author
janvt
authored
Merge pull request #19 from geekcell/feat/maker-query
Maker Command - Query
2 parents 3c3fb35 + 425a9c1 commit bb4c467

File tree

5 files changed

+192
-3
lines changed

5 files changed

+192
-3
lines changed

README.md

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,3 +186,25 @@ Options:
186186
--with-identity=WITH-IDENTITY Whether an identity value object should be created
187187
--with-suffix Adds the suffix "Model" to the model class name
188188
```
189+
190+
### Query / Command
191+
192+
These commands can be used to generate:
193+
194+
- A query and query handler class.
195+
- A command and command handler class.
196+
197+
The query / command generated is just an empty class. The handler class is registered as a message handler for the configured [Symfony Messenger](https://symfony.com/doc/current/messenger.html).
198+
199+
#### Command Output
200+
201+
```bash
202+
Description:
203+
Creates a new query|command class and handler
204+
205+
Usage:
206+
make:ddd:query|command [<name>]
207+
208+
Arguments:
209+
name The name of the query|command class (e.g. Customer)
210+
```

config/services.yaml

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,10 @@ services:
2525
tags:
2626
- { name: maker.command }
2727

28-
maker.maker.make_model:
29-
alias: GeekCell\DddBundle\Maker\MakeModel
30-
public: true
28+
GeekCell\DddBundle\Maker\MakeQuery:
29+
class: GeekCell\DddBundle\Maker\MakeQuery
30+
tags:
31+
- { name: maker.command }
3132

3233
GeekCell\DddBundle\Maker\Doctrine\DoctrineConfigUpdater:
3334
class: GeekCell\DddBundle\Maker\Doctrine\DoctrineConfigUpdater

src/Maker/MakeQuery.php

Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace GeekCell\DddBundle\Maker;
6+
7+
use GeekCell\Ddd\Contracts\Application\Query;
8+
use GeekCell\Ddd\Contracts\Application\QueryHandler;
9+
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;
21+
use Symfony\Component\Messenger\Attribute\AsMessageHandler;
22+
23+
const NAMESPACE_PREFIX = 'Application\\Query\\';
24+
25+
final class MakeQuery extends AbstractMaker implements InputAwareMakerInterface
26+
{
27+
public function __construct() {}
28+
29+
/**
30+
* @inheritDoc
31+
*/
32+
public static function getCommandName(): string
33+
{
34+
return 'make:ddd:query';
35+
}
36+
37+
/**
38+
* @inheritDoc
39+
*/
40+
public static function getCommandDescription(): string
41+
{
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+
{
64+
}
65+
66+
/**
67+
* @inheritDoc
68+
*/
69+
public function interact(InputInterface $input, ConsoleStyle $io, Command $command): void
70+
{
71+
}
72+
73+
/**
74+
* @inheritDoc
75+
*/
76+
public function generate(InputInterface $input, ConsoleStyle $io, Generator $generator): void
77+
{
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+
]),
101+
];
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();
111+
}
112+
113+
/**
114+
* @param ClassNameDetails $queryClassNameDetails
115+
* @param Generator $generator
116+
* @return void
117+
*/
118+
private function generateQueryHandler(ClassNameDetails $queryClassNameDetails, Generator $generator): void
119+
{
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()
133+
];
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();
143+
}
144+
}
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 Query
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 QueryHandler
9+
{
10+
public function __invoke(<?= $query_class_name ?> $query): Collection
11+
{
12+
}
13+
}

0 commit comments

Comments
 (0)