symkit / settings-bundle
A Symfony bundle for managing application-wide settings with a sectioned UI, automatic cache invalidation, and WebManifest generation.
Installs: 0
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Watchers: 0
Forks: 0
Open Issues: 0
Type:symfony-bundle
pkg:composer/symkit/settings-bundle
Requires
- php: >=8.2
- symfony/framework-bundle: ^7.0 || ^8.0
- symkit/crud-bundle: ~0.0.1
- symkit/form-bundle: ~0.0.1
- symkit/media-bundle: ~0.0.1
- symkit/menu-bundle: ~0.0.1
- symkit/metadata-bundle: ~0.0.1
Requires (Dev)
- deptrac/deptrac: ^2.0
- doctrine/doctrine-bundle: ^2.0
- doctrine/orm: ^3.6
- friendsofphp/php-cs-fixer: ^3.0
- infection/infection: ^0.29
- nyholm/symfony-bundle-test: ^3.0
- phpro/grumphp: ^2.0
- phpstan/phpstan: ^2.0
- phpunit/phpunit: ^11.0
- symfony/browser-kit: ^7.0 || ^8.0
- symfony/css-selector: ^7.0 || ^8.0
- symfony/var-exporter: ^7.0 || ^8.0
- symkit/bundle-ai-kit: ~0.0.1
README
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.
Requirements
- 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)
Features
- 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.
Installation
-
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
Configuration
| 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.
Custom entity and repository
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\MySettingsRepository
Map your entity in Doctrine and import only the admin route if you use the bundled admin UI.
Usage
Twig (when twig.enabled is true)
{{ settings.websiteName }}
{% set app_settings = app_settings() %}
{{ app_settings.websiteDescription }}
PHP
Inject the manager interface:
use Symkit\SettingsBundle\Contract\SettingsManagerInterface; public function __construct( private SettingsManagerInterface $settingsManager, ) {} public function someMethod(): void { $settings = $this->settingsManager->get(); }
WebManifest
When webmanifest.enabled is true and the route is imported, the manifest is served at /site.webmanifest.
Translations
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.
Contributing
Run make quality before committing. To install the git hook that strips Co-authored-by: lines from commit messages (e.g. if your IDE adds them), run make install-hooks.
License
MIT.