Installation:
composer require cpoint-eu/settings-bundle
Enable the bundle in config/bundles.php:
CreativePoint\SettingsBundle\CreativePointSettingsBundle::class => ['all' => true],
First Use Case:
Setting entity table:
php bin/console doctrine:migrations:diff
php bin/console doctrine:migrations:migrate
// src/DTO/AppSettings.php
namespace App\DTO;
class AppSettings
{
public string $siteName;
public bool $maintenanceMode;
}
config/packages/creative_point_settings.yaml):
creative_point_settings:
objects:
App\DTO\AppSettings: ~
Accessing Settings:
Inject the SettingsProvider service into your controller or service:
use CreativePoint\SettingsBundle\Provider\SettingsProviderInterface;
class SomeController
{
public function __construct(private SettingsProviderInterface $settingsProvider) {}
public function index()
{
$settings = $this->settingsProvider->get('App\DTO\AppSettings');
// Use $settings->siteName, $settings->maintenanceMode
}
}
Defining Settings:
AppSettings, EmailSettings).Setting table via a form, admin panel, or CLI command. Example:
php bin/console doctrine:fixtures:load --append
(Create a fixture to seed initial settings.)Caching Strategy:
cache_ttl). Override the cache key in config if needed:
creative_point_settings:
cache_key: 'app_settings_%s'
$this->settingsProvider->clearCache('App\DTO\AppSettings');
Validation:
Symfony\Component\Validator\Constraint on properties or using Symfony’s validation component:
use Symfony\Component\Validator\Constraints as Assert;
class AppSettings
{
#[Assert\NotBlank]
public string $siteName;
}
Environment-Specific Settings:
environment column in the Setting table to store environment-specific values (e.g., dev, prod).$settings = $this->settingsProvider->get('App\DTO\AppSettings', ['env' => 'prod']);
Dynamic Settings Updates:
settings.update event:
// src/EventListener/SettingsUpdateListener.php
namespace App\EventListener;
use CreativePoint\SettingsBundle\Event\SettingsEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class SettingsUpdateListener implements EventSubscriberInterface
{
public static function getSubscribedEvents(): array
{
return [
SettingsEvent::SETTINGS_UPDATE => 'onSettingsUpdate',
];
}
public function onSettingsUpdate(SettingsEvent $event)
{
// Log or trigger actions when settings are updated
}
}
Symfony Forms:
// src/Form/SettingsType.php
namespace App\Form;
use App\DTO\AppSettings;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
class SettingsType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('siteName')
->add('maintenanceMode');
}
}
public function editSettings(Request $request)
{
$settings = $this->settingsProvider->get('App\DTO\AppSettings');
$form = $this->createForm(SettingsType::class, $settings);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$this->settingsProvider->save($settings);
$this->addFlash('success', 'Settings updated!');
}
return $this->render('settings/edit.html.twig', ['form' => $form->createView()]);
}
Twig Integration:
// src/EventListener/TwigSettingsListener.php
namespace App\EventListener;
use CreativePoint\SettingsBundle\Provider\SettingsProviderInterface;
use Twig\Environment;
class TwigSettingsListener
{
public function __construct(
private SettingsProviderInterface $settingsProvider,
private Environment $twig
) {
$this->twig->addGlobal('app_settings', $this->settingsProvider->get('App\DTO\AppSettings'));
}
}
{{ app_settings.siteName }}
API Responses:
public function getSettings()
{
return $this->json($this->settingsProvider->get('App\DTO\AppSettings'));
}
Testing:
SettingsProviderInterface in tests:
$settingsProvider = $this->createMock(SettingsProviderInterface::class);
$settingsProvider->method('get')->willReturn(new AppSettings());
$this->container->set(SettingsProviderInterface::class, $settingsProvider);
Cache Invalidation:
$this->settingsProvider->clearCache('App\DTO\AppSettings');
$entityManager = $this->getDoctrine()->getManager();
$entityManager->beginTransaction();
try {
// Update settings...
$entityManager->flush();
$entityManager->commit();
$this->settingsProvider->clearCache('App\DTO\AppSettings');
} catch (\Exception $e) {
$entityManager->rollBack();
throw $e;
}
DTO Naming Collisions:
App\DTO\AppSettings).Missing Default Values:
null cases:
class AppSettings
{
public string $siteName = 'My App'; // Default value
}
Performance with Large Settings:
$this->settingsProvider->get('App\DTO\AppSettings', ['fields' => ['siteName']]);
Setting table for faster lookups:
CREATE INDEX idx_setting_name ON setting(name);
Environment Filtering:
environment filter in the provider is case-sensitive. Ensure consistency when storing/retrieving settings:
// Store
$setting->setEnvironment('prod');
// Retrieve
$this->settingsProvider->get('App\DTO\AppSettings', ['env' => 'prod']);
Bundle Configuration Overrides:
cache_key or cache_ttl requires a full config block. Partial overrides may not work as expected:
# Correct: Full block
creative_point_settings:
cache_key: 'custom_%s'
cache_ttl: 600
Cache Issues:
$cacheKey = $this->settingsProvider->getCacheKey('App\DTO\AppSettings');
php bin/console cache:clear
Missing Settings:
Setting table contains entries for your DTO. Run:
php bin/console doctrine:query:sql "SELECT * FROM setting WHERE name LIKE '%AppSettings%'"
How can I help you explore Laravel packages today?