मैं एक विशिष्ट मॉड्यूल के लिए ट्विग और कैश को कैसे अक्षम कर सकता हूं?


15

मैं Drupal 8 में एक मॉड्यूल पर काम कर रहा हूं, जो बाहरी REST एपी से समय संवेदनशील डेटा प्राप्त करता है। डेटा को संसाधित और ब्लॉक करने के लिए अग्रेषित किया जाता है। अंतिम डेटा को Twig टेम्पलेट पर भेजा जाता है जैसे:

...

public function build() {
  $build = [];

  $build['ticker_block'] = [
    '#theme' => 'module_theme',
    '#data' => $myService->data(),
  ];

  return $build;
}

यह उत्पादन वातावरण पर काम नहीं करता है जहां कैश सक्षम है और प्रदान किया गया डेटा बासी के रूप में दिखाई देता है। मैं केवल अपने मॉड्यूल के लिए कैश को कैसे अक्षम कर सकता हूं, और क्या मुझे इसे ट्विग टेम्पलेट और ब्लॉक प्लगइन दोनों के लिए करना होगा?

जवाबों:


27

आप कैश को रेंडर सरणी में #cache तत्व के साथ नियंत्रित कर सकते हैं।

कैश जोड़ने को अक्षम करने के लिए:

$build['#cache']['max-age'] = 0;

इस मामले में ब्लॉक एक सत्र के साथ उपयोगकर्ताओं या अनाम उपयोगकर्ताओं में लॉग इन के लिए कैश नहीं किया जाएगा।

यदि आप बिना सत्र के अनाम उपयोगकर्ताओं के लिए कैश अक्षम करना चाहते हैं:

इसे या तो पूरी तरह से page_cache मॉड्यूल को अनइंस्टॉल करके या किल स्विच को ट्रिगर करके अक्षम करें, देखें कि मैं किसी विशेष पृष्ठ को कैश होने से कैसे रोक सकता हूं? उदाहरण के लिए।

टहनी कोड का कैशिंग इससे जुड़ा नहीं है, टहनी कोड केवल एक बार कैश किया जाता है, पहली बार कैश क्लियर करने के बाद इसका उपयोग किया जाता है।

(संपादित करें आरोप। बर्दीर की टिप्पणी)


मुझे लगता है कि एक कैश संदर्भ इस विशिष्ट मामले में मदद नहीं करेगा, लेकिन शायद आप 0 की बजाय एक वास्तविक अधिकतम आयु का उपयोग करना चाहते हैं, जो पूरी तरह से अक्षम कैशिंग 60 की तरह है। यकीन नहीं कि आपका डेटा कितना संवेदनशील है, लेकिन आमतौर पर, चीजें हो सकती हैं एक या कुछ मिनट के लिए कैश किया जाए। यह भी ध्यान दें कि अधिकतम आयु अनाम पृष्ठ कैश को प्रभावित नहीं करती है। यदि आपको अनाम उपयोगकर्ताओं के लिए इसकी आवश्यकता है, तो आपको जावास्क्रिप्ट को उपयोग करके पूरी तरह से अक्षम करना होगा या डेटा प्राप्त करना होगा।
बर्दिर

@Berdir: मैं अनाम उपयोगकर्ताओं के लिए अधिकतम-आयु = 0 का उपयोग करता हूं, लेकिन सत्रों के साथ। यह अब देव में काम कर रहा है। क्या आपको लगता है कि यह उत्पादन के लिए ठीक है? पूरी तरह से अक्षम होने का क्या मतलब है?
4k4

यह ठीक है यदि आपके पास सत्र हैं, तो यह काम करता है। इसे या तो पृष्ठ_ कैश मॉड्यूल की पूरी तरह से स्थापना रद्द करके या किल स्विच को चालू करके अक्षम करें, उदाहरण के लिए drupal.stackexchange.com/questions/151254/… देखें ।
बेदिर

महान जानकारी के लिए धन्यवाद, मैंने जवाब में इसे जोड़ा है।
4k4

1
$ बिल्ड ['# कैश'] ['अधिकतम आयु'] = 0; चाल चली !!! हरफनमौला! :)
सोरिन

6

किसी विशिष्ट ब्लॉक को रोकने के लिए निम्नलिखित फ़ंक्शन का उपयोग करें:

/**
 * Implements hook_preprocess_HOOK() for block.html.twig.
 */
function template-name_preprocess_block(&$vars) {
  if($vars['derivative_plugin_id'] == 'add-block-id-name') {
    //-- This stops the block being cache in drupal 8
    $vars['#cache']['max-age'] = 0;
  }
}

बहुत बढ़िया जवाब।
पुपिल

2

किसी विशिष्ट पृष्ठ / सामग्री प्रकार / नियंत्रक के लिए कैश अक्षम करें

रूट घोषणा से कस्टम पृष्ठ के लिए कैश अक्षम करें।

यदि आप कस्टम नियंत्रक (कस्टम मॉड्यूल) के लिए कैश को अक्षम करना चाहते हैं, तो आपके पास no_cacheविकल्प (आपका_मॉड्यूएल.रूटिंग.लाइम) है। उदाहरण: फ़ाइल: mymodule.rout.yml

mymodule.myroute:
  path: '/mymodule/mypage'
  defaults:
    _controller: '\Drupal\mymodule\Controller\Pages::mypage'
    _title: 'No cache page'
  requirements:
    _access: 'TRUE'
  options:
    no_cache: 'TRUE'

मार्ग की प्रतिक्रियाओं को अस्वीकार्य के रूप में चिह्नित करने के लिए 'no_cache' मार्ग विकल्प जोड़ा गया


0

किसी विशेष ब्लॉक के कैशिंग को रोकने के लिए:

नीचे दिए गए कोड को theme_name.theme फ़ाइल में जोड़ें

function theme_name_preprocess_block(&$variables) {
  if ($variables['plugin_id'] == 'block_id') {
    $variables['#cache']['max-age'] = 0;
  }
}

0

किसी ब्लॉक प्रकार के लिए कैश को अक्षम करने के लिए, उस प्रकार के ब्लॉक को प्रीप्रोसेस करें और मैक्सिमम को 0 पर सेट करें।

   /**
     * Implements hook_preprocess_HOOK() for Block document templates.
     */
    function THEMENAME_preprocess_block(array &$variables) {

      //disbale cache from spotlight
      $content = $variables['elements']['content'];
      //dump($content); //check the contents
      if (isset($content['#block_content']) && $content['#block_content'] instanceof BlockContentInterface) {

        if ($content['#block_content']->bundle() == 'BLOCK_TYPE') {
          $variables['#cache']['max-age'] = 0;
        }

      }


    }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.