Installation:
composer require bluetea/setting-bundle
Add to config/bundles.php:
return [
// ...
BlueTea\SettingBundle\BlueTeaSettingBundle::class => ['all' => true],
];
Database Setup:
Run migrations (check src/Resources/doc/installation.md for schema). Example:
php bin/console doctrine:migrations:diff
php bin/console doctrine:migrations:migrate
First Use Case:
Define a setting via YAML (e.g., config/settings.yml):
app:
site_name: "My App"
maintenance_mode: false
Load and use in a controller:
use BlueTea\SettingBundle\Manager\AppSettingManager;
class DefaultController extends AbstractController {
public function index(AppSettingManager $settingManager) {
$siteName = $settingManager->get('app.site_name');
return $this->render('index.html.twig', ['siteName' => $siteName]);
}
}
App Settings (Key-Value Store):
# Set a value
php bin/console bluetea:setting:set app.site_name "New Name"
# Get a value (in code)
$value = $settingManager->get('app.site_name', 'default');
# List all settings
$allSettings = $settingManager->all();
// System-wide
$settingManager->set('app.theme', 'dark', 'system');
// User-specific (requires user context)
$settingManager->set('user.theme', 'light', 'user', $userId);
Entity Settings:
Product):
// In Product entity
use BlueTea\SettingBundle\Model\EntitySettingInterface;
class Product implements EntitySettingInterface {
// ...
}
EntitySettingManager:
$productSetting = $entitySettingManager->getSetting($product, 'price_discount');
$entitySettingManager->setSetting($product, 'price_discount', 10);
Validation:
# config/validator/validation.yml
BlueTea\SettingBundle\Model\AppSetting:
properties:
value:
- Type: string
- NotBlank: ~
Caching:
config/packages/bluetea_setting.yaml:
bluetea_setting:
app:
cache: true
cache_lifetime: 3600
Twig Integration: Extend Twig with a custom extension to access settings globally:
// src/Twig/AppExtension.php
class AppExtension extends \Twig\Extension\AbstractExtension {
public function getFunctions() {
return [
new \Twig\TwigFunction('setting', [$this->settingManager, 'get']),
];
}
}
Usage in Twig:
{{ setting('app.site_name') }}
Event Listeners: Subscribe to setting changes for side effects:
// src/EventListener/SettingListener.php
class SettingListener {
public function onSettingUpdate(SettingEvent $event) {
if ($event->getSetting()->getKey() === 'app.maintenance_mode') {
// Trigger maintenance mode logic
}
}
}
Register in services.yaml:
services:
App\EventListener\SettingListener:
tags:
- { name: kernel.event_listener, event: bluetea.setting.update, method: onSettingUpdate }
Deprecated Bundle:
User-Scoped Settings:
$userId in set()/get(). Omitting it defaults to system scope.// Fails silently if $userId is missing
$settingManager->get('user.theme', null, 'user');
Database Schema:
app_setting and entity_setting. Manual schema changes may break migrations.config/packages/bluetea_setting.yaml:
bluetea_setting:
app:
entity: App\Entity\CustomAppSetting
entity:
entity: App\Entity\CustomEntitySetting
Caching Quirks:
php bin/console cache:clear
Entity Settings:
EntitySettingInterface. Forgetting this causes runtime errors.Check for Missing Config:
null, verify config/packages/bluetea_setting.yaml exists and is loaded.Doctrine Events:
# config/packages/dev/doctrine.yaml
doctrine:
dbal:
logging: true
profiling: true
CLI Command Issues:
bluetea:setting:set may fail if the AppSetting entity is misconfigured. Rebuild the cache:
php bin/console cache:clear --env=dev
Custom Setting Types:
AppSetting entity to add metadata (e.g., description, group):
// src/Entity/AppSetting.php
class AppSetting extends AbstractAppSetting {
private $description;
private $group;
// Add getters/setters and update migrations.
}
Custom Validation:
# config/validator/validation.yml
BlueTea\SettingBundle\Model\AppSetting:
constraints:
- Callback: { callback: ['App\Validator\SettingValidator', 'validate'] }
Event Dispatching:
// src/EventSubscriber/SettingSubscriber.php
class SettingSubscriber implements EventSubscriberInterface {
public static function getSubscribedEvents() {
return [
SettingEvents::PRE_SET => 'onPreSet',
SettingEvents::POST_SET => 'onPostSet',
];
}
}
Alternative Storage:
SettingStorageInterface:
class RedisSettingStorage implements SettingStorageInterface {
public function save(AppSetting $setting) { /* ... */ }
public function find($key, $scope = null) { /* ... */ }
}
services.yaml:
services:
Bluetea\SettingBundle\Manager\AppSettingManager:
arguments:
$storage: '@redis_setting_storage'
Bulk Operations:
EntityManager directly:
$settings = $entityManager->getRepository(AppSetting::class)->findBy(['scope' => 'system']);
foreach ($settings as $setting) {
$setting->setValue($newValue);
}
$entityManager->flush();
How can I help you explore Laravel packages today?