drupalSettings
When to Use
Passing server-side data (PHP) to client-side JavaScript. Alternative to AJAX requests for static configuration data available at page render.
Decision
drupalSettings is a JavaScript object containing data from PHP. Attach settings via #attached['drupalSettings'] in render arrays. Settings are JSON-encoded and injected into page as <script type="application/json"> for CSP compatibility.
Security critical: NEVER pass sensitive data (passwords, API keys, tokens, private user data) through drupalSettings - it's visible in page source.
Pattern
PHP: Attaching settings:
$build['#attached']['drupalSettings']['moduleName']['configKey'] = [
'apiEndpoint' => '/api/data',
'itemsPerPage' => 10,
'enableFeature' => TRUE,
];
JavaScript: Accessing settings:
Drupal.behaviors.moduleFeature = {
attach(context, settings) {
// Settings passed as second parameter
const config = settings.moduleName.configKey;
const endpoint = config.apiEndpoint;
// Also available globally
const globalConfig = drupalSettings.moduleName.configKey;
}
};
Namespacing pattern (prevent conflicts):
// Good: module.feature.setting
$build['#attached']['drupalSettings']['myModule']['featureName']['setting'] = $value;
// Bad: global namespace pollution
$build['#attached']['drupalSettings']['setting'] = $value;
CSP compatibility: Settings rendered as <script type="application/json" data-drupal-selector="drupal-settings-json"> since Drupal 8.1 for Content Security Policy support.
Reference: https://www.drupal.org/node/2513818 - CSP-compatible JSON settings
Common Mistakes
- Passing sensitive data - WHY: Visible in page source, creates security vulnerability
- Not namespacing settings - WHY: Conflicts with other modules, settings overwritten
- Passing large datasets - WHY: Bloats page weight, use AJAX endpoints instead
- HTML in settings without escaping - WHY: XSS vulnerability when inserted into DOM
- Modifying drupalSettings in JS - WHY: Changes don't persist, only affects current page instance
See Also
- Security - XSS prevention with settings
- AJAX Integration - When to use AJAX instead of settings