aaronadal/config-bundle
Symfony bundle that loads configuration from multiple YAML files automatically. Define default and environment-specific glob paths; files in the current environment override defaults. Uses Symfony cache for fast startup and cleaner parameter/service management.
Installation:
composer require aaronadal/config-bundle
Register the bundle in config/bundles.php (Symfony 4+) or AppKernel.php (Symfony 3):
// config/bundles.php
return [
// ...
Aaronadal\ConfigBundle\AaronadalConfigBundle::class => ['all' => true],
];
Configure Paths:
Add this to config/packages/aaronadal_config.yaml (Symfony 4+):
aaronadal_config:
location:
defaults: '%kernel.project_dir%/config/parameters/defaults/*.yml'
environment: '%kernel.project_dir%/config/parameters/:env/*.yml'
For Symfony 3, use config.yml under config/packages/aaronadal_config.yml.
First Use Case:
Create a default config file at config/parameters/defaults/database.yml:
parameters:
database_driver: pdo_mysql
database_host: localhost
Override it for dev in config/parameters/dev/database.yml:
parameters:
database_host: localhost:3306
Restart your dev server (php bin/console server:run). The bundle merges these files automatically.
Layered Configuration:
defaults/ for shared settings (e.g., database.yml, services.yml).:env/ for environment-specific tweaks (e.g., dev/, prod/).config/parameters/
├── defaults/
│ ├── database.yml
│ └── mail.yml
└── dev/
└── database.yml # Overrides defaults/database.yml
Parameter Overrides:
defaults/ (e.g., app.yml):
parameters:
app.debug: '%kernel.debug%'
app.secret: '%env(APP_SECRET)%'
:env/ (e.g., prod/app.yml):
parameters:
app.secret: 'prod-secret-value'
Service Configuration:
config/services/
├── defaults/
│ └── monolog.yml
└── dev/
└── monolog.yml # Adds dev-specific handlers
config/services.yaml:
imports:
- { resource: '%kernel.project_dir%/config/services/defaults/*.yml' }
- { resource: '%kernel.project_dir%/config/services/:env/*.yml' }
Environment-Specific Routes:
config/routes/dev/*.yml or config/routes/prod/*.yml and merge them into your main routes.yaml.config/packages/ and reference them via imports in config/bundles.php.php bin/console cache:clear).validator to validate merged parameters early:
# config/validator/parameters.yml
App\Validator\Constraints\ValidDatabaseConfig: ~
Cache Dependency:
php bin/console cache:clear after changes.Placeholder Limitations:
:env is supported in paths. Avoid using %kernel.root_dir% or other parameters in location keys.kernel.root_dir in your glob patterns manually.Merge Conflicts:
# Bad: Overrides ALL defaults
parameters: { ... }
# Good: Only overrides specific keys
parameters:
database_host: override-value
Bundle Order:
AaronadalConfigBundle before bundles that depend on dynamically loaded parameters (e.g., FrameworkBundle).config/bundles.php.File Naming:
parameters.yml to prevent conflicts with Symfony’s built-in files).Verify Loading:
php bin/console debug:container --parameters
Debug Paths:
# config/packages/dev/aaronadal_config.yaml
aaronadal_config:
debug: true # Logs loaded files (if supported)
Merge Issues:
var_dump() in a custom compiler pass to inspect merged configurations:
// src/EventListener/ConfigDebugListener.php
public function onKernelRequest(GetResponseEvent $event) {
if ($event->isMasterRequest() && $this->debug) {
var_dump($this->container->getParameter('your_custom_param'));
}
}
Custom Loaders:
// src/Loader/CustomLoader.php
use Aaronadal\ConfigBundle\Loader\LoaderInterface;
class CustomLoader implements LoaderInterface {
public function load(string $path, string $env) {
return json_decode(file_get_contents($path), true);
}
}
services.yaml:
services:
Aaronadal\ConfigBundle\Loader\LoaderInterface:
class: App\Loader\CustomLoader
Pre/Post-Processing:
container.dumper events to modify loaded configurations:
// src/EventSubscriber/ConfigSubscriber.php
public static function getSubscribedEvents() {
return [
KernelEvents::CONTAINER_COMPILED => 'onContainerCompiled',
];
}
public function onContainerCompiled(ContainerCompiledEvent $event) {
$container = $event->getContainer();
$container->setParameter('app.processed_config', $this->process($container->getParameter('app.raw_config')));
}
Environment Detection:
staging):
# config/packages/aaronadal_config.yaml
aaronadal_config:
environment_detector: App\Detector\CustomEnvironmentDetector
Implement App\Detector\CustomEnvironmentDetector to return your custom environment name.Atomic Commits:
Document Overrides:
:env/ files to explain why a value is overridden:
# Override for dev to use SQLite for testing
parameters:
database_driver: pdo_sqlite
CI/CD Integration:
# .github/workflows/deploy.yml
- run: php bin/console cache:clear --env=prod
Backup Defaults:
defaults/ backup in version control (e.g., defaults.backup/) to reset overrides easily.Symfony 5+:
config/packages/ and ensure the bundle is auto-loaded via composer.json:
"extra": {
"symfony": {
"allow-overwrite": "*"
}
}
How can I help you explore Laravel packages today?