Skip to content

Commit b7699a1

Browse files
committed
Refactoring form rendering into a service
1 parent aa37ea1 commit b7699a1

File tree

7 files changed

+85
-23
lines changed

7 files changed

+85
-23
lines changed

src/Doctrine/EntityDetails.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,11 @@ public function getFormFields()
6868
}
6969
}
7070

71-
return $fields;
71+
$fieldsWithTypes = [];
72+
foreach ($fields as $field) {
73+
$fieldsWithTypes[$field] = null;
74+
}
75+
76+
return $fieldsWithTypes;
7277
}
7378
}

src/Maker/MakeCrud.php

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
use Symfony\Bundle\MakerBundle\Doctrine\DoctrineHelper;
2020
use Symfony\Bundle\MakerBundle\Generator;
2121
use Symfony\Bundle\MakerBundle\InputConfiguration;
22+
use Symfony\Bundle\MakerBundle\Renderer\FormTypeRenderer;
2223
use Symfony\Bundle\MakerBundle\Str;
2324
use Symfony\Bundle\MakerBundle\Validator;
2425
use Symfony\Bundle\TwigBundle\TwigBundle;
@@ -38,9 +39,12 @@ final class MakeCrud extends AbstractMaker
3839
{
3940
private $doctrineHelper;
4041

41-
public function __construct(DoctrineHelper $doctrineHelper)
42+
private $formTypeRenderer;
43+
44+
public function __construct(DoctrineHelper $doctrineHelper, FormTypeRenderer $formTypeRenderer)
4245
{
4346
$this->doctrineHelper = $doctrineHelper;
47+
$this->formTypeRenderer = $formTypeRenderer;
4448
}
4549

4650
public static function getCommandName(): string
@@ -149,14 +153,10 @@ public function generate(InputInterface $input, ConsoleStyle $io, Generator $gen
149153
)
150154
);
151155

152-
$generator->generateClass(
153-
$formClassDetails->getFullName(),
154-
'form/Type.tpl.php',
155-
[
156-
'bounded_full_class_name' => $entityClassDetails->getFullName(),
157-
'bounded_class_name' => $entityClassDetails->getShortName(),
158-
'form_fields' => $entityDoctrineDetails->getFormFields(),
159-
]
156+
$this->formTypeRenderer->render(
157+
$formClassDetails,
158+
$entityDoctrineDetails->getFormFields(),
159+
$entityClassDetails
160160
);
161161

162162
$templates = [

src/Maker/MakeForm.php

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
use Symfony\Bundle\MakerBundle\Doctrine\DoctrineHelper;
1818
use Symfony\Bundle\MakerBundle\Generator;
1919
use Symfony\Bundle\MakerBundle\InputConfiguration;
20+
use Symfony\Bundle\MakerBundle\Renderer\FormTypeRenderer;
2021
use Symfony\Bundle\MakerBundle\Str;
2122
use Symfony\Bundle\MakerBundle\Util\ClassDetails;
2223
use Symfony\Bundle\MakerBundle\Validator;
@@ -34,10 +35,12 @@
3435
final class MakeForm extends AbstractMaker
3536
{
3637
private $entityHelper;
38+
private $formTypeRenderer;
3739

38-
public function __construct(DoctrineHelper $entityHelper)
40+
public function __construct(DoctrineHelper $entityHelper, FormTypeRenderer $formTypeRenderer)
3941
{
4042
$this->entityHelper = $entityHelper;
43+
$this->formTypeRenderer = $formTypeRenderer;
4144
}
4245

4346
public static function getCommandName(): string
@@ -81,10 +84,10 @@ public function generate(InputInterface $input, ConsoleStyle $io, Generator $gen
8184
'Type'
8285
);
8386

84-
$formFields = ['field_name'];
85-
$boundClassVars = [];
87+
$formFields = ['field_name' => null];
8688

8789
$boundClass = $input->getArgument('bound-class');
90+
$boundClassDetails = null;
8891

8992
if (null !== $boundClass) {
9093
$boundClassDetails = $generator->createClassNameDetails(
@@ -100,17 +103,12 @@ public function generate(InputInterface $input, ConsoleStyle $io, Generator $gen
100103
$classDetails = new ClassDetails($boundClassDetails->getFullName());
101104
$formFields = $classDetails->getFormFields();
102105
}
103-
104-
$boundClassVars = [
105-
'bounded_full_class_name' => $boundClassDetails->getFullName(),
106-
'bounded_class_name' => $boundClassDetails->getShortName(),
107-
];
108106
}
109107

110-
$generator->generateClass(
111-
$formClassNameDetails->getFullName(),
112-
'form/Type.tpl.php',
113-
array_merge(['form_fields' => $formFields], $boundClassVars)
108+
$this->formTypeRenderer->render(
109+
$formClassNameDetails,
110+
$formFields,
111+
$boundClassDetails
114112
);
115113

116114
$generator->writeChanges();

src/Renderer/FormTypeRenderer.php

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
<?php
2+
3+
namespace Symfony\Bundle\MakerBundle\Renderer;
4+
5+
use Symfony\Bundle\MakerBundle\Generator;
6+
use Symfony\Bundle\MakerBundle\Str;
7+
use Symfony\Bundle\MakerBundle\Util\ClassNameDetails;
8+
9+
/**
10+
* @internal
11+
*/
12+
final class FormTypeRenderer
13+
{
14+
private $generator;
15+
16+
public function __construct(Generator $generator)
17+
{
18+
$this->generator = $generator;
19+
}
20+
21+
public function render(ClassNameDetails $formClassDetails, array $formFields, ClassNameDetails $boundClassDetails = null)
22+
{
23+
$fieldTypeUseStatements = [];
24+
$fields = [];
25+
foreach ($formFields as $name => $fieldTypeOptions) {
26+
$fieldTypeOptions = $fieldTypeOptions ?? ['type' => null, 'options' => []];
27+
28+
if (isset($fieldTypeOptions['type'])) {
29+
$fieldTypeUseStatements[] = $fieldTypeOptions['type'];
30+
}
31+
32+
$fields[$name] = $fieldTypeOptions;
33+
}
34+
35+
$this->generator->generateClass(
36+
$formClassDetails->getFullName(),
37+
'form/Type.tpl.php',
38+
[
39+
'bounded_full_class_name' => $boundClassDetails ? $boundClassDetails->getFullName() : null,
40+
'bounded_class_name' => $boundClassDetails ? $boundClassDetails->getShortName() : null,
41+
'form_fields' => $fields,
42+
'field_type_use_statements' => $fieldTypeUseStatements
43+
]
44+
);
45+
}
46+
}

src/Resources/config/makers.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626

2727
<service id="maker.maker.make_crud" class="Symfony\Bundle\MakerBundle\Maker\MakeCrud">
2828
<argument type="service" id="maker.doctrine_helper" />
29+
<argument type="service" id="maker.renderer.form_type_renderer" />
2930
<tag name="maker.command" />
3031
</service>
3132

@@ -43,6 +44,7 @@
4344

4445
<service id="maker.maker.make_form" class="Symfony\Bundle\MakerBundle\Maker\MakeForm">
4546
<argument type="service" id="maker.doctrine_helper" />
47+
<argument type="service" id="maker.renderer.form_type_renderer" />
4648
<tag name="maker.command" />
4749
</service>
4850

src/Resources/config/services.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,5 +50,9 @@
5050
<service id="maker.user_class_builder" class="Symfony\Bundle\MakerBundle\Security\UserClassBuilder" />
5151

5252
<service id="maker.security_config_updater" class="Symfony\Bundle\MakerBundle\Security\SecurityConfigUpdater" />
53+
54+
<service id="maker.renderer.form_type_renderer" class="Symfony\Bundle\MakerBundle\Renderer\FormTypeRenderer">
55+
<argument type="service" id="maker.generator" />
56+
</service>
5357
</services>
5458
</container>

src/Util/ClassDetails.php

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,14 @@ public function getFormFields(): array
3030
{
3131
$properties = $this->getProperties();
3232

33-
return array_diff($properties, ['id']);
33+
$fields = array_diff($properties, ['id']);
34+
35+
$fieldsWithTypes = [];
36+
foreach ($fields as $field) {
37+
$fieldsWithTypes[$field] = null;
38+
}
39+
40+
return $fieldsWithTypes;
3441
}
3542

3643
private function getProperties(): array

0 commit comments

Comments
 (0)