Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
74cb039
Do not support EOL versions of PHP and Symfony anymore
relthyg Dec 19, 2025
7f9a77c
allow Symfony 8
knallcharge Jan 6, 2026
40402df
Change boot method signature to return void
knallcharge Jan 9, 2026
16992a7
converted configs to PHP
Jan 9, 2026
ad2828d
Add return type declaration to load method
knallcharge Jan 9, 2026
2ece05a
Add return type declaration to process method
knallcharge Jan 9, 2026
01fac9c
Fix request method check to use request data
knallcharge Jan 9, 2026
f3dce90
Fix GET request handling for dynamic step navigation
knallcharge Jan 9, 2026
c6f9470
Refactor instanceId retrieval for dynamic navigation
knallcharge Jan 9, 2026
d223560
merged changes from relthyg
Jan 9, 2026
c07fc71
Allow PHP 7.4
relthyg Jan 16, 2026
4c6e302
Do not test for Symfony 6.4 with PHP 7.4
relthyg Jan 16, 2026
c6321b9
Merge branch 'symfony8' into knallcharge-master
relthyg Jan 16, 2026
c3e38e2
Convert `IntegrationTestBundle` config to PHP
relthyg Jan 16, 2026
0a27a4b
Use dev-Version of `craue/translation-tests` for symfony 8 compatibility
relthyg Jan 16, 2026
642be39
Ignore `var/`
relthyg Jan 19, 2026
eb899da
Merge branch 'symfony8' into knallcharge-master
relthyg Jan 19, 2026
488491c
Fix parameter retrieval from `Request`
relthyg Jan 19, 2026
9f5097a
Remove config parameter `twig.exception_controller`
relthyg Jan 20, 2026
9a6d778
Allow `doctrine/dbal:^4.4`, `doctrine/doctrine-bundle:^3.2`, `symfony…
relthyg Jan 20, 2026
5be312d
Use method `Connection::quoteSingleIdentifier` instead of `quoteIdent…
relthyg Jan 20, 2026
20c72b7
Do not use method `Table::setPrimaryKey()` as this is deprecated
relthyg Jan 20, 2026
6e0733f
Normalize `composer.json`
relthyg Jan 20, 2026
1b069a1
Use docker image `mysql:8.0` for all tests
relthyg Jan 20, 2026
4809797
Add server version to MySQL DSN
relthyg Jan 20, 2026
b500127
Use MySQL 8.0.44 explicitly
relthyg Jan 20, 2026
1eac04d
Use PostgreSQL 18.1 explicitly
relthyg Jan 20, 2026
755c0a6
Use method `Connection::quoteSingleIdentifier()` only if it exists
relthyg Jan 20, 2026
91ad766
Use method `Table::addPrimaryKeyConstraint()` only if it exists
relthyg Jan 20, 2026
4b53dc3
Cast value to string to satisfy PHPStan
relthyg Jan 20, 2026
ab2f2a1
Require DBAL 3.1
relthyg Jan 21, 2026
d35bc14
Remove usage of methods from DBAL < 3.1
relthyg Jan 21, 2026
9a15328
Remove unnecessary PHPStan error handlings
relthyg Jan 21, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 5 additions & 20 deletions .github/workflows/tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,51 +16,36 @@ jobs:
env:
SYMFONY_REQUIRE: ${{ matrix.symfony }}
SYMFONY_DEPRECATIONS_HELPER: ${{ matrix.symfony-deprecations }}
DB_DSN_MYSQL: mysql://test:test@127.0.0.1/craue_form_flow_tests
DB_DSN_POSTGRESQL: pgsql://test:test@127.0.0.1/craue_form_flow_tests
DB_DSN_MYSQL: mysql://test:test@127.0.0.1/craue_form_flow_tests?serverVersion=8.0.44
DB_DSN_POSTGRESQL: pgsql://test:test@127.0.0.1/craue_form_flow_tests?serverVersion=18.1
DB_DSN_SQLITE: sqlite:///sqlite.db

strategy:
fail-fast: false
matrix:
include:
-
php: '7.3'
dependencies: lowest
symfony-deprecations: max[indirect]=5
-
php: '8.4'
dependencies: highest
-
php: '7.4'
symfony: '5.4.*'
-
php: '8.0'
symfony: '5.4.*'
-
php: '8.1'
symfony: '5.4.*'
symfony: '6.4.*'
-
php: '8.2'
symfony: '6.4.*'
-
php: '8.3'
symfony: '6.4.*'
-
php: '8.2'
symfony: '7.2.*'
-
php: '8.4'
symfony: '7.4.*'
stability: dev
allow-failure: true
-
php: '8.4'
symfony: '8.0.*'

services:
mysql:
image: mysql:${{ (matrix.php == '7.3' && '5.7') || '8.0' }}
image: mysql:8.0.44
env:
MYSQL_USER: test
MYSQL_PASSWORD: test
Expand All @@ -75,7 +60,7 @@ jobs:
- 3306:3306

postgres:
image: postgres
image: postgres:18.1
env:
POSTGRES_USER: test
POSTGRES_PASSWORD: test
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,4 @@
/phpstan.neon
/phpunit.xml
/vendor
/var
2 changes: 1 addition & 1 deletion CraueFormFlowBundle.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ class CraueFormFlowBundle extends Bundle {
/**
* @return void
*/
public function boot() {
public function boot(): void {
/*
* Removes all temporary files created while handling file uploads.
* Use a shutdown function to clean up even in case of a fatal error.
Expand Down
14 changes: 7 additions & 7 deletions DependencyInjection/CraueFormFlowExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Extension\Extension;
use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
use Symfony\Component\DependencyInjection\Loader\PhpFileLoader;

/**
* Registration of the extension via DI.
Expand All @@ -23,19 +23,19 @@ class CraueFormFlowExtension extends Extension implements CompilerPassInterface
/**
* @return void
*/
public function load(array $config, ContainerBuilder $container) {
$loader = new XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
$loader->load('form_flow.xml');
$loader->load('twig.xml');
$loader->load('util.xml');
public function load(array $config, ContainerBuilder $container): void {
$loader = new PhpFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
$loader->load('form_flow.php');
$loader->load('twig.php');
$loader->load('util.php');

$container->registerForAutoconfiguration(FormFlowInterface::class)->addTag(self::FORM_FLOW_TAG);
}

/**
* @return void
*/
public function process(ContainerBuilder $container) {
public function process(ContainerBuilder $container): void {
$baseFlowDefinitionMethodCalls = $container->getDefinition('craue.form.flow')->getMethodCalls();

foreach (array_keys($container->findTaggedServiceIds(self::FORM_FLOW_TAG)) as $id) {
Expand Down
12 changes: 7 additions & 5 deletions Form/FormFlow.php
Original file line number Diff line number Diff line change
Expand Up @@ -538,9 +538,10 @@ protected function getRequestedStepNumber() {
case 'POST':
return intval($request->request->get($this->getFormStepKey(), $defaultStepNumber));
case 'GET':
return $this->allowDynamicStepNavigation || $this->allowRedirectAfterSubmit ?
intval($request->get($this->dynamicStepNavigationStepParameter, $defaultStepNumber)) :
$defaultStepNumber;
$result = $request->attributes->get($this->dynamicStepNavigationStepParameter, $request);
$var = ($request !== $result) ? $result : $request->query->get($this->dynamicStepNavigationStepParameter, (string)$defaultStepNumber);

return ($this->allowDynamicStepNavigation || $this->allowRedirectAfterSubmit) ? (int)$var : $defaultStepNumber;
}

return $defaultStepNumber;
Expand Down Expand Up @@ -625,7 +626,8 @@ protected function determineInstanceId() {
$instanceId = null;

if ($this->allowDynamicStepNavigation || $this->allowRedirectAfterSubmit) {
$instanceId = $request->get($this->getDynamicStepNavigationInstanceParameter());
$requestData = in_array($request->getMethod(), ['POST', 'PUT'], true) ? $request->request : $request->query;
$instanceId = $requestData->get($this->getDynamicStepNavigationInstanceParameter());
}

if ($instanceId === null) {
Expand All @@ -652,7 +654,7 @@ protected function bindFlow() {
$reset = true;
}

if (in_array($request->getMethod(), ['POST', 'PUT'], true) && $request->get($this->getFormStepKey()) !== null && !$this->dataManager->exists($this)) {
if (in_array($request->getMethod(), ['POST', 'PUT'], true) && $request->request->get($this->getFormStepKey()) !== null && !$this->dataManager->exists($this)) {
// flow is expired, drop posted data and reset
$request->request->replace();
$reset = true;
Expand Down
47 changes: 47 additions & 0 deletions Resources/config/form_flow.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
<?php

namespace Symfony\Component\DependencyInjection\Loader\Configurator;

return static function (ContainerConfigurator $container) {
$services = $container->services();
$parameters = $container->parameters();
$parameters->set('craue.form.flow.class', \Craue\FormFlowBundle\Form\FormFlow::class);
$parameters->set('craue.form.flow.storage.class', \Craue\FormFlowBundle\Storage\SessionStorage::class);
$parameters->set('craue.form.flow.event_listener.previous_step_invalid.class', \Craue\FormFlowBundle\EventListener\PreviousStepInvalidEventListener::class);
$parameters->set('craue.form.flow.event_listener.previous_step_invalid.event', \Craue\FormFlowBundle\Form\FormFlowEvents::PREVIOUS_STEP_INVALID);
$parameters->set('craue.form.flow.event_listener.flow_expired.class', \Craue\FormFlowBundle\EventListener\FlowExpiredEventListener::class);
$parameters->set('craue.form.flow.event_listener.flow_expired.event', \Craue\FormFlowBundle\Form\FormFlowEvents::FLOW_EXPIRED);

$services->set('craue.form.flow.storage_default', '%craue.form.flow.storage.class%')
->private()
->args([service('request_stack')]);

$services->alias('craue.form.flow.storage', 'craue.form.flow.storage_default')
->public();

$services->set('craue.form.flow.data_manager_default', \Craue\FormFlowBundle\Storage\DataManager::class)
->private()
->args([service('craue.form.flow.storage')]);

$services->alias('craue.form.flow.data_manager', 'craue.form.flow.data_manager_default');

$services->set('craue.form.flow', '%craue.form.flow.class%')
->call('setDataManager', [service('craue.form.flow.data_manager')])
->call('setFormFactory', [service('form.factory')])
->call('setRequestStack', [service('request_stack')])
->call('setEventDispatcher', [service('event_dispatcher')->ignoreOnInvalid()]);

$services->set('craue.form.flow.form_extension', \Craue\FormFlowBundle\Form\Extension\FormFlowFormExtension::class)
->tag('form.type_extension', ['extended_type' => \Symfony\Component\Form\Extension\Core\Type\FormType::class]);

$services->set('craue.form.flow.hidden_field_extension', \Craue\FormFlowBundle\Form\Extension\FormFlowHiddenFieldExtension::class)
->tag('form.type_extension', ['extended_type' => \Symfony\Component\Form\Extension\Core\Type\HiddenType::class]);

$services->set('craue.form.flow.event_listener.previous_step_invalid', '%craue.form.flow.event_listener.previous_step_invalid.class%')
->tag('kernel.event_listener', ['event' => '%craue.form.flow.event_listener.previous_step_invalid.event%', 'method' => 'onPreviousStepInvalid'])
->call('setTranslator', [service('translator')]);

$services->set('craue.form.flow.event_listener.flow_expired', '%craue.form.flow.event_listener.flow_expired.class%')
->tag('kernel.event_listener', ['event' => '%craue.form.flow.event_listener.flow_expired.event%', 'method' => 'onFlowExpired'])
->call('setTranslator', [service('translator')]);
};
71 changes: 0 additions & 71 deletions Resources/config/form_flow.xml

This file was deleted.

13 changes: 13 additions & 0 deletions Resources/config/twig.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<?php

namespace Symfony\Component\DependencyInjection\Loader\Configurator;

return static function (ContainerConfigurator $container) {
$services = $container->services();
$parameters = $container->parameters();
$parameters->set('craue_twig_extensions.formflow.class', \Craue\FormFlowBundle\Twig\Extension\FormFlowExtension::class);

$services->set('twig.extension.craue_formflow', '%craue_twig_extensions.formflow.class%')
->tag('twig.extension')
->call('setFormFlowUtil', [service('craue_formflow_util')]);
};
23 changes: 0 additions & 23 deletions Resources/config/twig.xml

This file was deleted.

15 changes: 15 additions & 0 deletions Resources/config/util.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<?php

namespace Symfony\Component\DependencyInjection\Loader\Configurator;

return static function (ContainerConfigurator $container) {
$services = $container->services();
$parameters = $container->parameters();
$parameters->set('craue_formflow.util.class', \Craue\FormFlowBundle\Util\FormFlowUtil::class);

$services->set('craue_formflow_util', '%craue_formflow.util.class%')
->public();

$services->alias(\Craue\FormFlowBundle\Util\FormFlowUtil::class, 'craue_formflow_util')
->private();
};
21 changes: 0 additions & 21 deletions Resources/config/util.xml

This file was deleted.

Loading