Repository navigation
Add first-class PHP configuration format - #6946
TavoNiievez wants to merge 1 commit into
Conversation
8ddfeaf to
17c7e25
Compare
- Introduced support for PHP configuration files alongside YAML. - Updated Api, Unit, and Bootstrap templates to generate PHP config files. - Added methods to handle PHP config generation and validation. - Enhanced test cases to validate the new PHP configuration format. - Migrated existing YAML configurations to PHP format in tests. - Improved error handling and output for configuration validation. - Added new test cases to ensure compatibility and correctness of the new configuration system.
|
cc. @ThomasLandauer , @burned42 & @samsonasik |
|
Moving away from YAML is an excellent idea IMO! Symfony just moved away from PHP methods to PHP arrays (e.g. |
|
Detail while looking at Codeception/symfony-module-tests#66 (comment) |
The reasons are explained in symfony/symfony#62092 |
|
Hi guys, thanks for the reply. I was fully aware of the information shared by @W0rma before and during my work on this PR. @ThomasLandauer Yes, I also thought about integrating that… But I preferred to keep this PR solely as a 1-to-1 mapping of the current Codeception configuration: if it’s a string, we handle strings; if it’s classes, we handle classes. It can easily be added in a later PR. |

Summary
Adds a PHP configuration format as a first-class alternative to YAML, designed to become the canonical way to configure Codeception in future versions. A
codeception.php(or*.suite.php/ env file) returns a fluent builder — or a raw array — instead of YAML. This unlocks IDE autocomplete, PHPStan-checkable config,::classconstants, nativegetenv(), and real PHP expressions (E_ALL & ~E_DEPRECATED), while keeping a 1:1 mapping to every existing YAML key. YAML is untouched and remains the default — the PHP format is fully opt-in.What's new
Builder API (
src/Codeception/Config/, namespaceCodeception\Config\):GlobalConfig,SuiteConfig(bothfinal),ConfigInterface(forever-contract =toArray()only),AbstractConfigBuilder(@internal),Params.module(),moduleConfig(),extension(),suite(),env(),commands()) + one raw escape hatchmerge().settings()uses explicit named nullable params (camelCase → snake_case) for autocomplete.Loader (
Configuration.php): per role (global / suite / env), if any.phpvariant exists, PHP wins and YAML is ignored — one rule everywhere. Config files are loaded exactly once, inside an isolated closure wrapped in output buffering (strayechocan't corrupt--xml/--jsonoutput), with concrete-type guards (aSuiteConfigreturned in global position throws a clear error naming the file and expected type). Cross-formatextendsworks both directions.Params:
%param%stays YAML-only; PHP configs usegetenv()in the global file andParams::get()in suite/env files (with a self-explaining exception ifParams::get()is called too early during global load).Tooling & scaffolding:
config:validatenow reports the loaded config file path.config:to-php— new command migrating existing YAML projects to builder-style PHP (--dry-runprints without writing; rendererLib/Generator/PhpConfigFile.php).bootstrap,init,g:suite,g:envgain PHP output;g:suite/g:envdetect the project format and no longer risk generating a silently-shadowed file when the other extension already exists.Design notes
Codeception\Config\namespace deliberately avoids colliding with the existingCodeception\Configurationclass.$defaultConfig/$defaultSuiteSettingskey gains no builder method — the canonical API can't silently lag core.merge()renamed fromwith()sincewith*implies immutable clone in PHP.lib-configpackage,var_exportarray generation. (Rationale available on request.)Backward compatibility
Non-breaking and additive. YAML behavior is unchanged; YAML remains the default scaffold. Flipping the default to PHP, and any future YAML deprecation, is left as a maintainer decision — not smuggled in here.
Tests
tests/unit/Codeception/Config/): every builder method → expected key/value, snake_case mapping, guards,merge()order, drift-guards,Params::get()timing.tests/cli/ConfigPhpFormatCest.php): discovery, php-wins, env-wins, cross-format extends, type/echo/invalid-return errors, inline-suite shadowing,config:to-phpmigrate → build → run.run cli,unit,coverage), plusphpstan analyse srcandcomposer cs-testsclean.Unrelated changes (disclosed)
This commit also bumps CI actions:
actions/checkout@v6 → v7andactions/cache@v3 → v6in.github/workflows/build.yml. Not history-rewritten; called out here for review.