Installation Add the bundle via Composer:
composer require ekyna/setting-bundle
Register the bundle in config/bundles.php (Symfony 4+):
Ekyna\SettingBundle\EkynaSettingBundle::class => ['all' => true],
Database Migration
Run the bundle’s migration to create the settings table:
php bin/console doctrine:migrations:diff
php bin/console doctrine:migrations:migrate
First Use Case
Define a setting in config/packages/ekyna_setting.yaml:
ekyna_setting:
settings:
app_name: "My Awesome App"
maintenance_mode: false
Access it in a controller:
use Ekyna\SettingBundle\Manager\SettingManager;
public function index(SettingManager $settingManager)
{
$appName = $settingManager->get('app_name');
return response()->json(['name' => $appName]);
}
Dynamic Configuration
Use the SettingManager to fetch and update settings at runtime:
// Get a setting (defaults to null if not found)
$timeout = $settingManager->get('api_timeout', 30);
// Update a setting
$settingManager->set('api_timeout', 60);
Scoped Settings
Store environment-specific settings (e.g., dev_* vs. prod_* prefixes) and filter them:
ekyna_setting:
scopes:
dev: ['dev_*']
prod: ['prod_*']
Retrieve scoped settings:
$devSettings = $settingManager->getScoped('dev');
Validation & Defaults Define defaults and validation rules in YAML:
ekyna_setting:
settings:
max_upload_size: { value: 10, type: integer, min: 1, max: 100 }
Access with validation:
$size = $settingManager->get('max_upload_size'); // Returns 10 (default)
Frontend Integration Expose settings to JavaScript via a Twig global:
{{ dump(app.ekyna_setting) }} {# Renders all settings #}
Or fetch specific settings in a controller and pass to a view:
return view('dashboard', [
'settings' => $settingManager->getAll(),
]);
Cache Settings
Enable caching in config/packages/ekyna_setting.yaml:
ekyna_setting:
cache: true
Clear cache after updates:
php bin/console cache:clear
Admin Panel
Build a CRUD interface for settings using Symfony’s make:crud or a package like EasyAdmin. Example:
// In a controller
$settings = $settingManager->getAll();
return $this->render('admin/settings.html.twig', ['settings' => $settings]);
Environment Overrides
Override settings per environment (e.g., .env):
# config/packages/ekyna_setting.yaml (dev)
ekyna_setting:
settings:
debug_mode: true
Deprecated Bundle
No Built-in ACL
// Example: Protect setting updates
public function update(SettingManager $manager, Request $request)
{
if (!$this->denyAccessUnlessGranted('EDIT_SETTINGS')) {
throw $this->createAccessDeniedException();
}
$manager->set($request->input('key'), $request->input('value'));
}
Cache Invalidation
// src/EventListener/SettingUpdateListener.php
public function onSettingUpdate(SettingEvent $event)
{
$this->container->get('cache')->clear();
}
YAML Parsing Quirks
true/false), not yes/no.# Bad: May fail
nested_setting: { key: value }
# Good:
nested_setting_key: value
settings table:
SELECT * FROM settings;
php bin/console debug:config ekyna_setting
Custom Storage
Override the default Doctrine storage by implementing Ekyna\SettingBundle\Storage\SettingStorageInterface:
class RedisSettingStorage implements SettingStorageInterface
{
public function save(Setting $setting) { /* ... */ }
public function findByKey($key) { /* ... */ }
}
Register in services:
services:
Ekyna\SettingBundle\Storage\SettingStorageInterface: '@redis_setting_storage'
Event System
Extend with events (e.g., SettingUpdatedEvent) by listening to ekyna_setting.update:
// config/services.yaml
Ekyna\SettingBundle\EventListener\SettingEventListener:
tags:
- { name: kernel.event_listener, event: ekyna_setting.update, method: onUpdate }
Twig Extensions Add custom filters/globals for Twig:
// src/Twig/SettingExtension.php
class SettingExtension extends \Twig\Extension\AbstractExtension
{
public function getFunctions()
{
return [
new \Twig\TwigFunction('get_setting', [$this->manager, 'get']),
];
}
}
Use in Twig:
{{ get_setting('app_name') }}
How can I help you explore Laravel packages today?