Skip to content

Commit 29422f7

Browse files
committed
generate service file
1 parent 2e6d6cb commit 29422f7

File tree

6 files changed

+101
-14
lines changed

6 files changed

+101
-14
lines changed

.github/workflows/master.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ jobs:
2121
- 8.2
2222
- 8.3
2323
steps:
24-
- uses: actions/checkout@v2
24+
- uses: actions/checkout@v4
2525
with:
2626
fetch-depth: 0
2727

@@ -36,7 +36,7 @@ jobs:
3636

3737
- name: Cache Composer packages
3838
id: composer-cache
39-
uses: actions/cache@v2
39+
uses: actions/cache@v4
4040
with:
4141
path: vendor
4242
key: ${{ runner.os }}-php-${{ hashFiles('**/composer.lock') }}

src/Command/ApiEntityCommand.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,11 +104,12 @@ protected function execute(InputInterface $input, OutputInterface $output)
104104

105105
$continue = $io->confirm('Add another field?');
106106
} while ($continue === true);
107+
107108
$data = [
108109
'entity' => $entityName,
109110
'fields' => $fields,
110111
'outputFolder' => $outputFolder,
111-
'outputFolderNamespace' => $outputFolderNamespace,
112+
'namespace' => $outputFolderNamespace,
112113
];
113114
$json = json_encode($data);
114115
$path = strtolower($entityName) . '.json';

src/Service/Api/EntityGeneratorService.php

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
namespace Bone\Generator\Service\Api;
66

77
use Bone\Generator\Traits\CanGenerateFile;
8-
use Doctrine\DBAL\Types\Types;
98
use Nette\PhpGenerator\ClassType;
109
use Nette\PhpGenerator\PhpFile;
1110
use Nette\PhpGenerator\PhpNamespace;
@@ -54,17 +53,10 @@ public function generateEntity($outputFolder, string $baseNamespace, string $ent
5453
$this->createField($namespace, $class, $field);
5554
}
5655

56+
$this->createToArray($class, $fields);
5757
$this->writeFile($file, $fileName);
5858
}
5959

60-
private function createPHPFile(): PhpFile
61-
{
62-
$file = new PhpFile();
63-
$file->setStrictTypes();
64-
65-
return $file;
66-
}
67-
6860
private function createNamespace(PhpFile $file, string $entityNamespace): PhpNamespace
6961
{
7062
$namespace = $file->addNamespace($entityNamespace);
@@ -115,7 +107,7 @@ private function createField(PhpNamespace $namespace, ClassType $class, array $d
115107
$property->setPrivate();
116108
$property->setType($phpType);
117109
$attributeData = ['type' => $doctrineType];
118-
$regex = '#.max:+(?<length>\d+).+#';
110+
$regex = '#.+max:(?<length>\d+).+#';
119111
preg_match($regex, $validation, $result);
120112

121113
if ($result['length']) {
@@ -217,4 +209,33 @@ private function addGetterAndSetter(string $field, string $type, ClassType $clas
217209
$getter->setBody($getterBody);
218210
$setter->setBody($setterBody);
219211
}
212+
213+
private function createToArray(ClassType $class, array $fields): void
214+
{
215+
$method = $class->addMethod('toArray');
216+
$method->setReturnType('array');
217+
$body = "return [\n";
218+
219+
foreach ($fields as $field) {
220+
$body .= ' \'' . $field['name'] . '\' => ';
221+
$body .= $this->getToArrayGetter($field['name'], $field['type']);
222+
$body .= "\n";
223+
}
224+
225+
$body .= '];';
226+
$method->setBody($body);
227+
}
228+
229+
private function getToArrayGetter(string $field, string $type): string
230+
{
231+
switch ($type) {
232+
case 'date':
233+
case 'datetime':
234+
return '$this->' . $field . '->format(\'Y-m-d H:i:s\'),';
235+
case 'json':
236+
return '$this->get' . ucfirst($field) . '(),';
237+
default:
238+
return '$this->' . $field . ',';
239+
}
240+
}
220241
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Bone\Generator\Service\Api;
6+
7+
use Bone\Generator\Traits\CanGenerateFile;
8+
use Nette\PhpGenerator\ClassType;
9+
use Nette\PhpGenerator\PhpFile;
10+
use Nette\PhpGenerator\PhpNamespace;
11+
12+
class ServiceGeneratorService
13+
{
14+
use CanGenerateFile;
15+
16+
public function generateService($outputFolder, string $baseNamespace, string $entityName): void
17+
{
18+
$entityNamespace = $baseNamespace . '\\Service';
19+
$entity = $baseNamespace . '\\Entity\\' . $entityName;
20+
$folderName = $outputFolder . '/Service';
21+
$fileName = $folderName . '/' . $entityName . 'Service.php';
22+
$this->ensureNoFileExists($fileName);
23+
$this->makeFolder($folderName);
24+
$file = $this->createPHPFile();
25+
$namespace = $this->createNamespace($file, $entityNamespace, $entity);
26+
$class = $this->createClass($namespace, $entityName);
27+
$this->createGetEntityClass($class, $entityName);
28+
$this->writeFile($file, $fileName);
29+
}
30+
31+
private function createNamespace(PhpFile $file, string $entityNamespace, string $entity): PhpNamespace
32+
{
33+
$namespace = $file->addNamespace($entityNamespace);
34+
$namespace->addUse('Bone\BoneDoctrine\Service\RestService');
35+
$namespace->addUse($entity);
36+
37+
return $namespace;
38+
}
39+
40+
private function createClass(PhpNamespace $namespace, string $entityName): ClassType
41+
{
42+
$class = $namespace->addClass($entityName . 'Service');
43+
$class->setExtends('Bone\BoneDoctrine\Service\RestService');
44+
45+
return $class;
46+
}
47+
48+
private function createGetEntityClass(ClassType $class, string $entityName): void
49+
{
50+
$method = $class->addMethod('getEntityClass');
51+
$method->setReturnType('string');
52+
$method->setBody('return ' . $entityName . '::class;');
53+
}
54+
}

src/Service/ApiGeneratorService.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
namespace Bone\Generator\Service;
66

77
use Bone\Generator\Service\Api\EntityGeneratorService;
8+
use Bone\Generator\Service\Api\ServiceGeneratorService;
89
use Bone\Generator\Traits\CanGenerateFile;
910
use Symfony\Component\Console\Style\SymfonyStyle;
1011

@@ -44,7 +45,9 @@ public function generateEntity(): void
4445

4546
public function generateService(): void
4647
{
47-
48+
$generator = new ServiceGeneratorService();
49+
$generator->generateService($this->outputFolder, $this->baseNamespace, $this->entityName);
50+
$this->io->info('generated service..');
4851
}
4952

5053
public function generateController(): void

src/Traits/CanGenerateFile.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,4 +59,12 @@ protected function makeFolder(string $folderName): void
5959
}
6060
}
6161
}
62+
63+
protected function createPHPFile(): PhpFile
64+
{
65+
$file = new PhpFile();
66+
$file->setStrictTypes();
67+
68+
return $file;
69+
}
6270
}

0 commit comments

Comments
 (0)