2121use App \Form \Generator \ProjectType ;
2222use App \PHPDocker \Generator \Generator ;
2323use App \PHPDocker \PhpExtension \AvailableExtensionsFactory ;
24- use App \PHPDocker \Project \Project ;
25- use App \PHPDocker \Project \ServiceOptions \GlobalOptions ;
26- use App \PHPDocker \Project \ServiceOptions \Php as PhpOptions ;
24+ use App \PHPDocker \Project \ProjectFactory ;
2725use Symfony \Bundle \FrameworkBundle \Controller \AbstractController ;
2826use Symfony \Component \HttpFoundation \BinaryFileResponse ;
2927use Symfony \Component \HttpFoundation \Request ;
@@ -37,6 +35,7 @@ class GeneratorController extends AbstractController
3735{
3836 public function __construct (
3937 private readonly Generator $ generator ,
38+ private readonly ProjectFactory $ projectFactory ,
4039 private readonly string $ environment ,
4140 ) {
4241 }
@@ -52,7 +51,7 @@ public function create(Request $request): BinaryFileResponse|Response
5251 if ($ form ->isSubmitted () === true && $ form ->isValid () === true ) {
5352 /** @var array $data */
5453 $ data = $ form ->getData ();
55- $ project = $ this ->hydrateProject ($ data );
54+ $ project = $ this ->projectFactory -> fromFormData ($ data );
5655
5756 // Generate zip file with docker project
5857 $ zipFile = $ this ->generator ->generate ($ project );
@@ -71,86 +70,7 @@ public function create(Request $request): BinaryFileResponse|Response
7170
7271 return $ this ->render ('generator.html.twig ' , [
7372 'form ' => $ form ->createView (),
74- 'phpExtensionsJson ' => json_encode (AvailableExtensionsFactory::getAllExtensionNames ()),
73+ 'phpExtensionsJson ' => json_encode (AvailableExtensionsFactory::getAllExtensionNames (), JSON_THROW_ON_ERROR ),
7574 ]);
7675 }
77-
78- private function hydrateProject (array $ formData ): Project
79- {
80- $ phpData = $ formData ['phpOptions ' ];
81-
82- $ extensions = $ phpData ['phpExtensions ' ] ?? [];
83-
84- $ phpOptions = new PhpOptions (
85- version: $ phpData ['version ' ],
86- extensions: $ extensions ,
87- hasGit: $ phpData ['hasGit ' ],
88- frontControllerPath: $ phpData ['frontControllerPath ' ],
89- );
90-
91- $ globalOptionsData = $ formData ['globalOptions ' ];
92- $ globalOptions = new GlobalOptions (
93- basePort: $ globalOptionsData ['basePort ' ],
94- appPath: rtrim ($ globalOptionsData ['appPath ' ], '/ ' ),
95- dockerWorkingDir: rtrim ($ globalOptionsData ['dockerWorkingDir ' ], '/ ' ),
96- );
97-
98- $ project = new Project (
99- phpOptions: $ phpOptions ,
100- globalOptions: $ globalOptions ,
101- );
102-
103- $ project ->getMemcachedOptions ()->setEnabled ($ formData ['hasMemcached ' ]);
104- $ project ->getRedisOptions ()->setEnabled ($ formData ['hasRedis ' ]);
105- $ project ->getMailhogOptions ()->setEnabled ($ formData ['hasMailhog ' ]);
106- $ project ->getClickhouseOptions ()->setEnabled ($ formData ['hasClickhouse ' ]);
107-
108- $ mysqlData = $ formData ['mysqlOptions ' ];
109- if ($ mysqlData ['hasMysql ' ] === true ) {
110- $ project
111- ->getMysqlOptions ()
112- ->setEnabled (true )
113- ->setVersion ($ mysqlData ['version ' ])
114- ->setDatabaseName ($ mysqlData ['databaseName ' ])
115- ->setRootPassword ($ mysqlData ['rootPassword ' ])
116- ->setUsername ($ mysqlData ['username ' ])
117- ->setPassword ($ mysqlData ['password ' ]);
118- }
119-
120- $ mariaDbData = $ formData ['mariadbOptions ' ];
121- if ($ mariaDbData ['hasMariadb ' ] === true ) {
122- $ project
123- ->getMariadbOptions ()
124- ->setEnabled (true )
125- ->setVersion ($ mariaDbData ['version ' ])
126- ->setDatabaseName ($ mariaDbData ['databaseName ' ])
127- ->setRootPassword ($ mariaDbData ['rootPassword ' ])
128- ->setUsername ($ mariaDbData ['username ' ])
129- ->setPassword ($ mariaDbData ['password ' ]);
130- }
131-
132- // For some reason, form data comes with version as int (instead of the original string)
133- // because postgres versions can be cast as int (eg Postgres::VERSION_15 = '15' at some point the form casts
134- // it to 15
135- $ pgData = $ formData ['postgresOptions ' ];
136- if ($ pgData ['hasPostgres ' ] === true ) {
137- $ project
138- ->getPostgresOptions ()
139- ->setEnabled (true )
140- ->setVersion ((string ) $ pgData ['version ' ])
141- ->setDatabaseName ($ pgData ['databaseName ' ])
142- ->setRootUser ($ pgData ['rootUser ' ])
143- ->setRootPassword ($ pgData ['rootPassword ' ]);
144- }
145-
146- $ esData = $ formData ['elasticsearchOptions ' ];
147- if ($ esData ['hasElasticsearch ' ] === true ) {
148- $ project
149- ->getElasticsearchOptions ()
150- ->setEnabled (true )
151- ->setVersion ($ esData ['version ' ]);
152- }
153-
154- return $ project ;
155- }
15676}
0 commit comments