A Symfony bundle for managing application-wide settings with a sectioned UI, automatic cache invalidation, and WebManifest generation. Features are activable per block (admin, webmanifest, Twig, metadata provider). Entity and repository are configurable so you can use your own classes.
- PHP 8.2+
- Symfony 7.x or 8.x
- symkit/media-bundle (for Media fields and entity relations)
- symkit/form-bundle, symkit/crud-bundle, symkit/metadata-bundle, symkit/menu-bundle (for the admin UI)
- Sectioned Form: Organize settings into logical groups (General, Logos, Social, Icons) via
FormSectionType(symkit/form-bundle). - Singleton Management: Single settings entity with cache and invalidation on update.
- WebManifest: Service to generate
site.webmanifestdata; route can be enabled/disabled. - Twig: Global
settingsvariable andapp_settings()function (optional). - Metadata: Optional
SiteInfoProviderfor symkit/metadata-bundle. - Translations: Domain
SymkitSettingsBundlewith EN and FR provided.
-
Install the bundle:
composer require symkit/settings-bundle
-
Register the bundle in
config/bundles.php:return [ // ... Symkit\SettingsBundle\SettingsBundle::class => ['all' => true], ];
-
Configure Doctrine mapping in
config/packages/doctrine.yaml(adjustdir/prefixif using a custom entity):doctrine: orm: mappings: Settings: type: attribute is_bundle: false dir: '%kernel.project_dir%/vendor/symkit/settings-bundle/src/Entity' prefix: 'Symkit\SettingsBundle\Entity' alias: Settings
-
Create
config/packages/symkit_settings.yaml:symkit_settings: cache_expires_after: 86400 admin: enabled: true route_prefix: admin webmanifest: enabled: true twig: enabled: true metadata_provider: enabled: true doctrine: entity: Symkit\SettingsBundle\Entity\Settings repository: Symkit\SettingsBundle\Repository\SettingsRepository
-
Routes: Import only the route files for features you enable.
- If
admin.enabledis true, inconfig/routes.yaml:symkit_settings_admin: resource: '@SymkitSettingsBundle/config/routes_admin.yaml' prefix: '/%symkit_settings.admin.route_prefix%'
- If
webmanifest.enabledis true:symkit_settings_webmanifest: resource: '@SymkitSettingsBundle/config/routes_webmanifest.yaml'
- If
-
Metadata (optional)
Ifmetadata_provider.enabledis true, set your app’s metadata bundle to use the settings provider, e.g. inconfig/packages/symkit_metadata.yaml:symkit_metadata: site_info_provider: Symkit\SettingsBundle\Provider\SettingsSiteInfoProvider
| Option | Type | Default | Description |
|---|---|---|---|
cache_expires_after |
int | 86400 |
Cache TTL in seconds. |
admin.enabled |
bool | true |
Register admin controller and admin routes. |
admin.route_prefix |
string | admin |
URL prefix for admin (e.g. /admin/settings). |
webmanifest.enabled |
bool | true |
Register webmanifest controller and route. |
twig.enabled |
bool | true |
Register Twig extension (settings, app_settings()). |
metadata_provider.enabled |
bool | true |
Register SiteInfoProvider for symkit/metadata-bundle. |
doctrine.entity |
string | Symkit\SettingsBundle\Entity\Settings |
FQCN of settings entity. |
doctrine.repository |
string | Symkit\SettingsBundle\Repository\SettingsRepository |
FQCN of settings repository. |
Disabling a feature (e.g. admin.enabled: false) means the corresponding services and routes are not registered; do not import the related route file in that case.
Your entity must implement Symkit\SettingsBundle\Contract\SettingsInterface. Your repository must implement Symkit\SettingsBundle\Contract\SettingsRepositoryInterface and provide a constructor compatible with the bundle (e.g. ManagerRegistry + string $entityClass for a Doctrine repository).
Example:
symkit_settings:
doctrine:
entity: App\Entity\MySettings
repository: App\Repository\MySettingsRepositoryMap your entity in Doctrine and import only the admin route if you use the bundled admin UI.
{{ settings.websiteName }}
{% set app_settings = app_settings() %}
{{ app_settings.websiteDescription }}Inject the manager interface:
use Symkit\SettingsBundle\Contract\SettingsManagerInterface;
public function __construct(
private SettingsManagerInterface $settingsManager,
) {}
public function someMethod(): void
{
$settings = $this->settingsManager->get();
}When webmanifest.enabled is true and the route is imported, the manifest is served at /site.webmanifest.
The bundle uses the domain SymkitSettingsBundle and ships with translations/SymkitSettingsBundle.en.xlf and SymkitSettingsBundle.fr.xlf. You can override or add messages in your app’s translations/ directory with the same domain.
Run make quality before committing.
MIT.