ecourty/platform-parameter-bundle
Install the Bundle
composer require ecourty/platform-parameter-bundle
Register the bundle in config/bundles.php:
return [
// ...
EdouardCourty\PlatformParameterBundle\PlatformParameterBundle::class => ['all' => true],
];
Configure the Bundle
Add basic configuration in config/packages/ecourty_platform_parameter.yaml:
ecourty_platform_parameter:
db_driver: doctrine # or 'array' for in-memory storage
cache_pool: cache.app
Run Database Migrations
php bin/console doctrine:migrations:diff
php bin/console doctrine:migrations:migrate
Define a Parameter via CLI
php bin/console ecourty:platform-parameter:create --name="site.maintenance_mode" --type="bool" --value="false"
Access a Parameter in Code
use EdouardCourty\PlatformParameterBundle\Parameter\ParameterManager;
$maintenanceMode = $this->get(ParameterManager::class)->get('site.maintenance_mode');
// Enable/disable a feature flag dynamically
$featureEnabled = $this->get(ParameterManager::class)->get('features.new_ui_enabled', false);
// In a controller
if ($featureEnabled) {
return $this->render('new_ui.html.twig');
}
Create Parameters
php bin/console ecourty:platform-parameter:create$manager->create('site.timezone', 'string', 'UTC');
Update Parameters
php bin/console ecourty:platform-parameter:update$manager->update('site.timezone', 'Europe/Paris');
Fetch Parameters
$timezone = $manager->get('site.timezone', 'UTC'); // string
$maintenanceMode = $manager->get('site.maintenance_mode', false); // bool
$timeout = $manager->get('api.timeout', 30); // int
$params = $manager->getMultiple(['site.timezone', 'api.timeout']);
Cache Management
$manager->invalidateCache('site.*'); // Wildcard invalidation
$manager->clearCache();
Dependency Injection
Bind ParameterManager to a service alias for easier access:
# config/services.yaml
services:
App\ParameterManager: '@EdouardCourty\PlatformParameterBundle\Parameter\ParameterManager'
Twig Integration Extend Twig with a global function:
// src/Twig/AppExtension.php
public function getPlatformParameter(string $name, $default = null): mixed
{
return $this->parameterManager->get($name, $default);
}
Register in config/packages/twig.yaml:
twig:
globals:
platform_parameter: '@EdouardCourty\PlatformParameterBundle\Parameter\ParameterManager'
Event-Driven Updates Listen for parameter updates to trigger side effects:
// src/EventListener/ParameterUpdateListener.php
public function onParameterUpdated(ParameterUpdatedEvent $event)
{
if ($event->getParameterName() === 'site.maintenance_mode') {
$this->cache->clear('maintenance_page');
}
}
Validation Layer Add validation rules for parameters (e.g., using Symfony Validator):
use Symfony\Component\Validator\Constraints as Assert;
$constraints = new Assert\Collection([
'value' => new Assert\Type(['type' => 'bool']),
'min' => new Assert\GreaterThanOrEqual(['value' => 0]),
]);
Parameter Namespaces Use dot notation for hierarchical parameters:
$manager->get('features.email.notifications.enabled');
Fetch all under a namespace:
$features = $manager->getNamespace('features');
Environment-Specific Parameters Override parameters per environment via config:
# config/packages/ecourty_platform_parameter.yaml
ecourty_platform_parameter:
parameters:
site.debug: '%kernel.debug%'
api.base_url: '%env(API_BASE_URL)%'
Parameter-Based Configuration Replace hardcoded configs with parameters:
// Instead of:
$maxRetries = 3;
// Use:
$maxRetries = $manager->get('api.max_retries', 3);
Cache Invalidation Race Conditions
invalidateCache() after bulk updates or wrap in a transaction:
$entityManager->beginTransaction();
try {
$manager->update('param1', $value1);
$manager->update('param2', $value2);
$manager->invalidateCache('param*');
$entityManager->commit();
} catch (\Exception $e) {
$entityManager->rollBack();
throw $e;
}
Type Safety Gaps
$value = $manager->get('param', 'default');
if (!is_int($value)) {
throw new \RuntimeException('Parameter must be an integer');
}
Wildcard Cache Invalidations
*) may clear unrelated cache.site.* or features.*.Doctrine Event Conflicts
# config/services.yaml
services:
App\EventListener\ParameterListener:
tags:
- { name: doctrine.event_listener, event: postUpdate, priority: 255 }
Parameter Existence Check
if (!$manager->has('nonexistent.param')) {
// Handle missing parameter
}
Cache Debugging
config/packages/cache.yaml:
framework:
cache:
pools:
cache.app:
adapter: cache.null # Force cache misses
php bin/console cache:pool:list
php bin/console cache:pool:clear cache.app
CLI Verbosity
Use -v or -vv flags for detailed output:
php bin/console ecourty:platform-parameter:list -vv
Database Driver Switching
db_driver from doctrine to array after initial setup requires manual data migration.php bin/console ecourty:platform-parameter:export --format=json > params.json
ecourty_platform_parameter:
db_driver: array
php bin/console ecourty:platform-parameter:import --format=json --file=params.json
Case Sensitivity
snake_case).Default Values in Config
config/packages/ecourty_platform_parameter.yaml:
ecourty_platform_parameter:
default_cache_ttl: 3600 # Override default TTL (300s)
cache_prefix: 'platform_params_'
ParameterType interface:
use EdouardCourty\PlatformParameterBundle\Parameter\ParameterType;
class JsonType implements ParameterType
{
public function getType(): string
{
return 'json';
}
public function serialize(mixed $value): string
{
return json_encode($value);
}
public function deserialize(string $value): mixed
{
return json_decode($value
How can I help you explore Laravel packages today?