symplify/config-transformer
Automates refactoring and normalization of configuration files, helping you transform legacy or inconsistent configs into a unified format. Supports common PHP config styles and streamlines upgrades by applying consistent, repeatable changes across large codebases.
Installation Add the package via Composer:
composer require symplify/config-transformer --dev
Register the service provider in config/app.php under providers:
Symplify\ConfigTransformer\Bootstrap\BootstrapProvider::class,
First Use Case
Convert a Symfony YAML config (e.g., config/packages/doctrine.yaml) to PHP:
php vendor/bin/config-transformer transform config/packages/doctrine.yaml --format=php
Outputs a PHP array in config/packages/doctrine.php.
Where to Look First
vendor/bin/config-transformer (for one-off conversions).Symplify\ConfigTransformer\ValueObject\ConfigTransformer (for programmatic use).CLI Workflow
config-transformer in CI/CD pipelines to auto-generate PHP configs from YAML:
php vendor/bin/config-transformer transform config/packages/*.yaml --format=php --overwrite
git diff to review changes before committing.Programmatic Integration Load and transform configs dynamically in Laravel:
use Symplify\ConfigTransformer\ValueObject\ConfigTransformer;
$configTransformer = app(ConfigTransformer::class);
$phpConfig = $configTransformer->transformFileToArray('config/packages/doctrine.yaml');
Laravel Service Provider
Bootstrap configs in register():
public function register()
{
$configs = $this->transformConfigs(['doctrine', 'security']);
foreach ($configs as $name => $config) {
$this->mergeConfigFrom($config, "packages/{$name}");
}
}
private function transformConfigs(array $names): array
{
$transformer = app(ConfigTransformer::class);
return collect($names)
->map(fn($name) => $transformer->transformFileToArray("config/packages/{$name}.yaml"))
->toArray();
}
Partial Transforms Target specific sections of a YAML file:
php vendor/bin/config-transformer transform config/packages/security.yaml --format=php --path=firewalls
config:cache:
php artisan config:cache
config/packages/dev/doctrine.yaml and config/packages/prod/doctrine.yaml separately, then merge them in config/doctrine.php:
return array_merge(
require __DIR__.'/packages/dev/doctrine.php',
require __DIR__.'/packages/prod/doctrine.php'
);
$transformer->transformFileToJson('config/packages/api.yaml');
Parameter References
%parameter% syntax. Ensure parameters are defined in parameters.yaml or passed via --parameters:
php vendor/bin/config-transformer transform config/packages/security.yaml --parameters=parameters.yaml
--resolve-parameters to auto-resolve from config/services.yaml or environment variables.Nested Arrays/Objects
doctrine.orm.entity_managers) may require explicit path targeting:
--path=doctrine.orm.entity_managers.default
--dump-ast to inspect the Abstract Syntax Tree (AST) of the YAML.Overwriting Existing Files
--overwrite flag is destructive. Use --dry-run first to preview changes:
php vendor/bin/config-transformer transform config/packages/*.yaml --format=php --dry-run
Laravel-Specific Quirks
tags: [doctrine.event_subscriber]) are lost in PHP. Manually add them post-transform:
$config['services']['app.event_subscriber']['tags'] = ['doctrine.event_subscriber'];
{% env('APP_DEBUG') %} with Laravel’s env() helper:
'debug' => (bool) env('APP_DEBUG'),
php vendor/bin/config-transformer transform --verbose config/packages/security.yaml
php vendor/bin/config-transformer transform --dump-ast config/packages/security.yaml
config/services.yaml:
framework:
debug: true
Custom Transformers
Extend Symplify\ConfigTransformer\ValueObject\Transformer\TransformerInterface to handle domain-specific YAML:
class CustomTransformer implements TransformerInterface
{
public function transform(array $config): array
{
// Custom logic (e.g., convert legacy keys)
return $config;
}
}
Register it in BootstrapProvider.
Pre/Post-Transform Hooks
Use Laravel’s events to modify configs before/after transformation:
// In a service provider
event(new ConfigTransforming($yamlPath, $phpConfig));
Template-Based Transforms
Combine with Symfony/Component/Config to validate transformed configs against schemas:
use Symfony\Component\Config\Loader\LoaderInterface;
$loader = new MyLoader();
$config = $loader->load($transformedConfig);
git add config/packages/doctrine.php && git commit -m "feat: convert doctrine config to PHP"
.gitignore to speed up builds:
mkdir -p config/packages/cache && mv config/packages/*.php config/packages/cache/
// @phpstan-ignore-next-line for dynamic configs if static analysis complains about type mismatches.post-install-cmd:
{
"scripts": {
"post-install-cmd": [
"php vendor/bin/config-transformer transform config/packages/*.yaml --format=php --overwrite"
]
}
}
How can I help you explore Laravel packages today?