मैंने एक ऐसे मुद्दे पर भाग लिया है जहां एक ब्लॉक जो प्रति पृष्ठ अद्वितीय होना चाहिए, लॉग-आउट उपयोगकर्ताओं के लिए नहीं है। मुद्दा एक कस्टम ब्लॉक प्लगइन है जिसमें मेरे पास एक खोज खोज पृष्ठ है जिसमें कस्टम फ़िल्टर शामिल हैं (उजागर फ़िल्टर के लिए कस्टम प्रतिस्थापन की तरह। ब्लॉक / व्यवस्थापक / संरचना / ब्लॉक के माध्यम से रखा गया है)।
Drupal 8 के बारे में मैंने जो कुछ भी सीखा है, उसके आधार पर मैंने अपने बिल्ड ऐरे में कैश संदर्भों को जोड़ा:
public function build() {
$search_form = \Drupal::formBuilder()->getForm('Drupal\mymodule\Form\SearchForm');
return [
'search_form' => $search_form,
'#cache' => ['contexts' => ['url.path', 'url.query_args']]
];
}
लेकिन ऐसा लगता है कि यह गलत होना चाहिए क्योंकि जब लॉग-आउट किया जाता है, तो ब्लॉक पहले दृश्य पर कैश हो जाता है, और जब यूआरएल बदल जाता है, तो यह ब्लॉक का एक नया संस्करण नहीं दिखा रहा था।
मुझे लगा कि यह वह दृश्य पृष्ठ हो सकता है जो समस्या पैदा कर रहा था, लेकिन जब मैंने दृश्य पृष्ठ पर कैशिंग बंद किया, तब भी यह मुद्दा बना रहा।
मैं इस मुद्दे को कई तरीकों से ठीक करने में सक्षम था, उदाहरण के लिए, एक preprocess_block हुक का उपयोग करके:
function mymodule_preprocess_block__mycustomsearchblock(&$variables) {
$variables['#cache']['contexts'][] = 'url.path';
$variables['#cache']['contexts'][] = 'url.query_args';
}
लेकिन इसने मुझे परेशान किया मैं कैश संदर्भों को अपने ब्लॉक के बिल्ड ऐरे में नहीं डाल सका।
चूँकि मेरा ब्लॉक ब्लॉकबेस का विस्तार करता है, इसलिए मैंने getCacheContexts () विधि को आज़माने का फैसला किया, खासकर जब से मैंने देखा कि कोर के भीतर कुछ मॉड्यूल इस तरह से कर रहे हैं।
public function getCacheContexts() {
return Cache::mergeContexts(parent::getCacheContexts(), ['url.path', 'url.query_args']);
}
यह भी मुद्दा तय हो गया है, लेकिन दिलचस्प बात यह है कि जब मैं प्रीप्रोसेस ब्लॉक फ़ंक्शन में चर का उत्पादन करता हूं, तो ये $ चर ['# कैश'] ['संदर्भ'] में प्रदर्शित नहीं होते हैं, लेकिन वे $ चर में दिखाते हैं [तत्व] '] [' # कैश '] [' संदर्भों ']
array:5 [▼
0 => "languages:language_interface"
1 => "theme"
2 => "url.path"
3 => "url.query_args"
4 => "user.permissions"
]
मैं यह पता लगाने की कोशिश कर रहा हूं कि यह कैसे काम करता है, और यह बिल्ड फ़ंक्शन से क्यों काम नहीं कर रहा था।
Viewcore () फ़ंक्शन पर /core/modules/block/src/BlockViewBuilder.php को देखते हुए, ऐसा लगता है कि यह इकाई और प्लगइन से कैश टैग को खींचता है:
'contexts' => Cache::mergeContexts(
$entity->getCacheContexts(),
$plugin->getCacheContexts()
),
तो यह बताता है कि मेरे ब्लॉक प्लगइन में getCacheContexts () पद्धति को जोड़ने से मेरे ब्लॉक में संदर्भ क्यों जुड़ते हैं। इसके अलावा, एक ही कक्षा में प्रेंडरेंडर पद्धति को देखते हुए, ऐसा लगता है कि यह ब्लॉक बिल्ड फ़ंक्शन में कैश ऐरे का उपयोग नहीं करता है, जो मुझे भ्रमित करता है, क्योंकि ऐसा लगता है कि Drupal 8 में कैशिंग जोड़ने का तरीका #cache जोड़ना है तत्वों को प्रस्तुत करने के लिए तत्व।
तो मेरा सवाल है,
1) क्या कैश संदर्भों को सीधे ब्लॉक प्लगइन में सरणी पर जोड़ा गया है?
2) यदि ऐसा है, तो क्या इसके आसपास कोई रास्ता है, क्या हमें इसे बिल्ड ऐरे के चाइल्ड एलिमेंट में जोड़ने की जरूरत है?
3) अगर संदर्भ को सीधे तौर पर नजरअंदाज किया जाता है, तो एक getCacheContexts () को कस्टम मॉड्यूल में ब्लॉक प्लगइन्स के लिए जाने का तरीका जोड़ रहा है?