Skip to content

Commit 504725a

Browse files
committed
generate basic controller
1 parent fdfff4b commit 504725a

File tree

2 files changed

+109
-8
lines changed

2 files changed

+109
-8
lines changed

src/Command/ControllerCommand.php

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@
88
use Symfony\Component\Console\Output\OutputInterface;
99
use Symfony\Component\Console\Style\SymfonyStyle;
1010

11+
use function array_search;
12+
use function count;
13+
1114
class ControllerCommand extends Command
1215
{
1316
public function __construct(
@@ -26,23 +29,23 @@ protected function execute(InputInterface $input, OutputInterface $output)
2629
{
2730
$io = new SymfonyStyle($input, $output);
2831
$io->title('Bone Framework Generator');
29-
$srcFolderNamespace = $io->ask('Enter the base namespace for src/ : ', 'Bone\\App');
30-
$controllerNamespace = $io->ask('Enter the controller namespace: ', 'Controller');
32+
$srcFolderNamespace = $io->ask('Enter the base namespace for src/ : ', 'Bone');
33+
$controllerNamespace = $io->ask('Enter the controller namespace: ', 'App\\Controller');
3134
$controllerName = $io->ask('Enter the controller name: ', 'TestController');
3235
$features = [];
3336
$keepAddingFeatures = true;
3437
$chosenFeatures = [];
35-
$features = ['entity manager', 'i18n', 'logger', 'pdo', 'serializer', 'session', 'site config', 'view', 'continue'];
38+
$features = [...ControllerGeneratorService::FEATURES, 'continue'];
3639

37-
while ($keepAddingFeatures) {
40+
while ($keepAddingFeatures && count($features) > 1) {
3841
$io->horizontalTable(['selected Featues'], [[\implode(', ', $chosenFeatures)]]);
3942
$feature = $io->choice('Select a feature or choose to continue', $features);
4043

4144
if ($feature === 'continue') {
4245
$keepAddingFeatures = false;
4346
} else {
4447
$chosenFeatures[] = $feature;
45-
$key = \array_search($feature, $features);
48+
$key = array_search($feature, $features);
4649
unset($features[$key]);
4750
}
4851
}
@@ -57,8 +60,8 @@ protected function execute(InputInterface $input, OutputInterface $output)
5760
return Command::SUCCESS;
5861
}
5962

60-
$this->controllerGeneratorService->generateController($srcFolderNamespace, $controllerNamespace, $controllerName, $features);
61-
$io->success('Generated ' . $namespace . '\\' . $controllerName . ' in BUILDFOLDERHERE');
63+
$this->controllerGeneratorService->generateController($srcFolderNamespace, $controllerNamespace, $controllerName, $chosenFeatures);
64+
$io->success('Generated ' . $namespace . '\\' . $controllerName . ' in ' . $path);
6265

6366
return Command::SUCCESS;
6467
}

src/Service/ControllerGeneratorService.php

Lines changed: 99 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,112 @@
44

55
namespace Bone\Generator\Service;
66

7+
use Bone\Generator\Exception\GeneratorException;
8+
use Nette\PhpGenerator\PhpFile;
9+
use Nette\PhpGenerator\PsrPrinter;
10+
11+
use function explode;
12+
use function file_exists;
13+
use function file_put_contents;
14+
use function implode;
15+
use function in_array;
16+
use function sprintf;
17+
718
class ControllerGeneratorService
819
{
20+
const F_ENTITY_MANAGER = 'entity manager';
21+
const F_I18N = 'i18n';
22+
const F_LOGGER = 'logger';
23+
const F_PDO = 'pdo';
24+
const F_SERIALIZER = 'serializer';
25+
const F_SESSION = 'session';
26+
const F_SITE_CONFIG = 'site config';
27+
const F_VIEW = 'view';
28+
29+
const FEATURES = [
30+
self::F_ENTITY_MANAGER,
31+
self::F_I18N,
32+
self::F_LOGGER,
33+
self::F_PDO,
34+
self::F_SERIALIZER,
35+
self::F_SESSION,
36+
self::F_SITE_CONFIG,
37+
self::F_VIEW,
38+
];
39+
40+
const INTERFACES = [
41+
self::F_ENTITY_MANAGER => 'Bone\BoneDoctrine\EntityManagerAwareInterface',
42+
self::F_I18N => 'Bone\I18n\I18nAwareInterface',
43+
self::F_LOGGER => 'Bone\Log\LoggerAwareInterface',
44+
self::F_PDO => 'Bone\Db\DbProviderInterface',
45+
self::F_SERIALIZER => 'Bone\Controller\SerializerAwareInterface',
46+
self::F_SESSION => 'Bone\Server\SessionAwareInterface',
47+
self::F_SITE_CONFIG => 'Bone\Server\SiteConfigAwareInterface',
48+
self::F_VIEW => 'Bone\View\ViewAwareInterface',
49+
];
50+
51+
const TRAITS = [
52+
self::F_ENTITY_MANAGER => 'Bone\BoneDoctrine\Traits\HasEntityManagerTrait',
53+
self::F_I18N => 'Bone\I18n\Traits\HasTranslatorTrait',
54+
self::F_LOGGER => 'Bone\Log\Traits\HasLoggerTrait',
55+
self::F_PDO => 'Bone\Db\HasDbTrait',
56+
self::F_SERIALIZER => 'Bone\Controller\Traits\HasSerializer',
57+
self::F_SESSION => 'Bone\Server\Traits\HasSessionTrait',
58+
self::F_SITE_CONFIG => 'Bone\Server\Traits\HasSiteConfigTrait',
59+
self::F_VIEW => 'Bone\View\Traits\HasViewTrait',
60+
];
61+
962
public function generateController(
1063
string $srcFolderNamespace,
1164
string $controllerNamespace,
1265
string $controllerName,
13-
string $features
66+
array $features
1467
): void {
68+
$controllerNamespacePath = implode('/', explode('\\', $controllerNamespace));
69+
$fileName = './src/' . $controllerNamespacePath . '/' . $controllerName . '.php';
70+
$this->ensureNoFileExists($fileName);
71+
$file = new PhpFile();
72+
$file->setStrictTypes();
73+
$namespace = $srcFolderNamespace . '\\' . $controllerNamespace;
74+
$namespace = $file->addNamespace($namespace);
75+
$namespace->addUse('Bone\Http\Response');
76+
$namespace->addUse('Psr\Http\Message\ResponseInterface');
77+
$namespace->addUse('Psr\Http\Message\ServerRequestInterface');
78+
$class = $namespace->addClass($controllerName);
79+
80+
foreach ($features as $feature) {
81+
$namespace->addUse(self::INTERFACES[$feature]);
82+
$namespace->addUse(self::TRAITS[$feature]);
83+
$file->addUse(self::INTERFACES[$feature]);
84+
$file->addUse(self::TRAITS[$feature]);
85+
$class->addImplement(self::INTERFACES[$feature]);
86+
$class->addTrait(self::TRAITS[$feature]);
87+
}
88+
89+
$method = $class->addMethod('index');
90+
$method->addParameter('request')->setType('Psr\Http\Message\ServerRequestInterface');
91+
$method->setReturnType('Psr\Http\Message\ResponseInterface');
92+
$method->setBody('return new Response();');
93+
94+
if (in_array('logger', $features)) {
95+
$method = $class->addMethod('getChannel');
96+
$method->setReturnType('string');
97+
$method->setBody('return \'default\';');
98+
}
99+
100+
$printer = new PsrPrinter();
101+
$code = $printer->printFile($file);
102+
$result = file_put_contents($fileName, $code);
103+
104+
if (!$result) {
105+
throw new GeneratorException(sprintf(GeneratorException::FILE_WRITE_ERROR, $fileName));
106+
}
107+
}
15108

109+
private function ensureNoFileExists(string $fileName): void
110+
{
111+
if (file_exists($fileName)) {
112+
throw new GeneratorException(GeneratorException::FILE_EXISTS);
113+
}
16114
}
17115
}

0 commit comments

Comments
 (0)