Skip to content

Commit dfdef4b

Browse files
authored
Modernize PHP 8.5 project models and generators (#395)
* Modernize archive and generator internals * Modernize PHP extension catalog * Modernize project service option models * Tighten external port offset return types * Extract project form-data factory * Add enum-backed service version catalogs
1 parent 4d1dea8 commit dfdef4b

48 files changed

Lines changed: 1479 additions & 927 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

config/services.yaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ services:
3333
# please note that last definitions always *replace* previous ones
3434

3535
App\PHPDocker\Zip\Archiver:
36+
arguments:
37+
$baseFolder: 'phpdocker'
3638
shared: false
3739

3840
# Instantiate some third party libraries we need for autowiring our own services
@@ -49,4 +51,3 @@ services:
4951

5052
Symfony\Component\HttpFoundation\Session\Storage\Handler\RedisSessionHandler:
5153
arguments: [ '@Redis' ]
52-

src/Controller/GeneratorController.php

Lines changed: 4 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,7 @@
2121
use App\Form\Generator\ProjectType;
2222
use App\PHPDocker\Generator\Generator;
2323
use 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;
2725
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
2826
use Symfony\Component\HttpFoundation\BinaryFileResponse;
2927
use 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

Comments
 (0)