कॉन्फ़िगरेशन ओवरराइड सिस्टम
Drupal 8 की कॉन्फ़िगरेशन प्रणाली कॉन्फ़िगरेशन को एकीकृत तरीके से प्रबंधित करती है। डिफ़ॉल्ट रूप से Drupal कॉन्फ़िगरेशन डेटा को डेटाबेस में संग्रहीत करता है, लेकिन इसे YAML फ़ाइलों में निर्यात किया जा सकता है, जिससे संस्करण नियंत्रण (version control) का उपयोग करके कॉन्फ़िगरेशन को प्रबंधित करना संभव होता है। हालाँकि, कुछ स्थितियों में कॉन्फ़िगरेशन मानों को विशिष्ट उद्देश्यों के लिए ओवरराइड करना आवश्यक होता है। Drupal 7 में एक global वेरिएबल $conf था, जिसे अक्सर settings.php में conditional overrides के साथ कॉन्फ़िगरेशन के लिए सेट किया जाता था। इस प्रणाली की बड़ी कमी यह थी कि overrides वास्तविक कॉन्फ़िगरेशन में लिखे जाते थे। जब किसी फ़ॉर्म को सेव किया जाता था जिसमें overridden मान थे, तो conditional override वास्तविक कॉन्फ़िगरेशन स्टोरेज में चला जाता था।
Drupal 8 एक कॉन्फ़िगरेशन ओवरराइड सिस्टम प्रस्तुत करता है, जो:
- इन overrides को मानक कॉन्फ़िगरेशन मानों के ऊपर अस्थायी लेयर (temporary layers) के रूप में बनाए रखता है
- कॉन्फ़िगरेशन फ़ॉर्म्स के लिए overridden मानों का उपयोग नहीं करता
- Overrides को अन्य कॉन्फ़िगरेशन फ़ाइलों के साथ संग्रहीत कर सकता है ताकि स्टेजिंग और version control का समर्थन कर सके (उदाहरण के लिए, भाषाई overrides के मामले में; नीचे देखें)।
Drupal 7 का global वेरिएबल $conf अब Drupal 8 में $config कहलाता है और इसे डिफ़ॉल्ट रूप से कॉन्फ़िगरेशन सिस्टम में सक्रिय किया गया है।
ग्लोबल ओवरराइड्स
Drupal 8 अभी भी global $config का उपयोग करने की अनुमति देता है। कॉन्फ़िगरेशन प्रणाली इन overrides को Drupal\Core\Config\ConfigFactory::get() के कार्यान्वयन के माध्यम से जोड़ती है। जब आप कॉन्फ़िगरेशन से कोई मान प्राप्त करते हैं, तो global $config को return value को बदलने का मौका मिलता है:
// सिस्टम साइट मेंटेनेंस संदेश प्राप्त करें। यह मान डिफ़ॉल्ट रूप से
// global $config (और translations, नीचे देखें) द्वारा ओवरराइड किया जा सकता है।
$message = \Drupal::config('system.maintenance')->get('message');
ग्लोबल $config में, उदाहरण के लिए settings.php में, कॉन्फ़िगरेशन मानों को ओवरराइड करने के लिए, उनके कॉन्फ़िगरेशन keys का उपयोग करें:
$config['system.maintenance']['message'] = 'Sorry, our site is down now.';
Nested मानों के लिए nested array keys का उपयोग करें:
$config['system.performance']['css']['preprocess'] = 0;
settings.php के बाहर $config का उपयोग करते समय, पिछले global $config का उपयोग करें;
उपलब्ध कॉन्फ़िगरेशन वेरिएबल्स की पहचान करने के लिए निम्न तरीकों का उपयोग करना उपयोगी हो सकता है:
- UI से «Configuration Manager» मॉड्यूल का उपयोग करके, जो /admin/config/development/configuration/single/export पर स्थित है
- YML कॉन्फ़िगरेशन फ़ाइलों को सीधे जाँचकर
- या drush का उपयोग करके
drush config-list drush config-get system.performance --include-overridden
ध्यान दें कि settings.php में $config से overridden मान Drupal प्रशासन UI में दिखाई नहीं देंगे (जब तक कि आप Configuration Override Warn या Config Override Inspector जैसे मॉड्यूल का उपयोग न करें) या drush में बिना --include-overridden फ़्लैग के। प्रशासनिक UI केवल वे मान दिखाता है जो कॉन्फ़िगरेशन में सेव किए गए हैं।
सुरक्षा कारणों से API keys को override करने का उदाहरण देखें: Commerce Gateway API Keys Overrides
ओवरराइड्स से बचना
आप कॉन्फ़िगरेशन को बिना overrides के प्राप्त कर सकते हैं ताकि raw मानों तक पहुँच सके (उदाहरण के लिए, फ़ॉर्म्स के लिए, जहाँ overridden मानों को सेव करने से बचना आवश्यक है)। यह विशेष रूप से बहुभाषी वातावरण में महत्वपूर्ण है, जहाँ कॉन्फ़िगरेशन अक्सर अनुवादों के रूप में override किया जाता है।
// ओवरराइड्स के साथ साइट का नाम प्राप्त करें।
$site_name = \Drupal::config('system.site')->get('name');
// ओवरराइड्स के बिना साइट का नाम प्राप्त करें।
$site_name = \Drupal::config('system.site')->getOriginal('name', FALSE);
// ध्यान दें कि mutable config हमेशा override-free होता है।
$site_name = \Drupal::configFactory()->getEditable('system.site')->get('name');
भाषा ओवरराइड्स
उदाहरण: किसी उपयोगकर्ता को ईमेल भेजने के लिए उसकी कॉन्फ़िगरेशन उपयोगकर्ता की भाषा में होनी चाहिए, न कि पेज की। इसके लिए सही भाषा सेट करें, कॉन्फ़िगरेशन आधारित कार्य करें और फिर भाषा वापस सेट करें:
$language_manager = \Drupal::service('language_manager');
$langcode = $account->getPreferredLangcode();
$language = $language_manager->getLanguage($langcode);
$original_language = $language_manager->getConfigOverrideLanguage();
$language_manager->setConfigOverrideLanguage($language);
$mail_config = \Drupal::config('user.mail');
// ईमेल भेजें...
$language_manager->setConfigOverrideLanguage($original_language);
भाषाई overrides को कॉन्फ़िगरेशन स्टोरेज में language.config.$langcode.[config_name] नामक फ़ाइलों में संग्रहीत किया जाता है। ये overrides चरणबद्ध translation और version control का समर्थन करते हैं।
ये overrides schema जानकारी के आधार पर बनाए जाते हैं (देखें कॉन्फ़िगरेशन स्कीमा)। मुख्य कॉन्फ़िगरेशन translation मॉड्यूल इन schemas का उपयोग करता है translation UI बनाने के लिए।
मॉड्यूल्स से ओवरराइड्स प्रदान करना
मॉड्यूल स्तर पर भी ओवरराइड्स प्रदान करना संभव है। Drupal core ग्लोबल और भाषाई overrides को सपोर्ट करता है, लेकिन modules अपनी आवश्यकताओं के अनुसार अन्य प्रकार के overrides परिभाषित कर सकते हैं, जैसे role-based, contextual, domain-specific, आदि।
ConfigFactory उन सेवाओं को कॉल करता है जो config.factory.override टैग के साथ चिह्नित होती हैं:
services:
config_example.overrider:
class: Drupal\config_example\Config\ConfigExampleOverrides
tags:
- {name: config.factory.override, priority: 5}
उच्च priority वाले overrides कम priority वाले overrides पर प्राथमिकता रखते हैं (यदि एक ही कॉन्फ़िगरेशन key हो)।
namespace Drupal\config_example\Config;
use Drupal\Core\Cache\CacheableMetadata;
use Drupal\Core\Config\ConfigFactoryOverrideInterface;
use Drupal\Core\Config\StorageInterface;
class ConfigExampleOverrides implements ConfigFactoryOverrideInterface {
public function loadOverrides($names) {
$overrides = [];
if (in_array('system.site', $names)) {
$overrides['system.site'] = ['name' => 'Overridden site name!'];
}
return $overrides;
}
public function getCacheSuffix() {
return 'ConfigExampleOverrider';
}
public function getCacheableMetadata($name) {
return new CacheableMetadata();
}
public function createConfigObject($name, $collection = StorageInterface::DEFAULT_COLLECTION) {
return NULL;
}
}
कॉन्फ़िगरेशन ओवरराइड्स तीन स्तरों पर काम करते हैं: language, modules और settings.php। settings.php सबसे उच्च प्राथमिकता रखता है।
ध्यान दें कि Drupal core की कॉन्फ़िगरेशन forms overridden मानों का उपयोग नहीं करतीं।
यदि आपको ओवरराइड में raw मानों की आवश्यकता है, तो \Drupal::config के बजाय \Drupal::configFactory का उपयोग करें:
$original = \Drupal::configFactory()->getEditable('system.site')->getOriginal('name', FALSE);
अधिक जानकारी
ओवरराइड सिस्टम Drupal 8 में #2098119 में जोड़ा गया। ऐतिहासिक जानकारी देखें: #1646580, #1763640, और #2020361।