कैशिंग के बिना अन्य प्राप्त करें


11

इस ट्यूटोरियल Drupal कंसोल की drupal gprrकमांड का उपयोग करते हुए , मैंने Drupal 8 में एक कस्टम REST संसाधन बनाया है। मैं एक साधारण JSON ऑब्जेक्ट को पुनः प्राप्त करने के लिए इस संसाधन का उपयोग करने में सक्षम हूं, जो वर्तमान उपयोगकर्ता को GET करने के लिए नमस्ते कहता है:

http://localhost/example/hello?_format=json

JSON लौटा तो इस तरह दिखता है:

{ "hello": "tyler" }

यह अपेक्षित है, क्योंकि मैं लॉग इन हूं। लेकिन जब मैं लॉगआउट करता हूं, और संसाधन पर एक और GET करता हूं, तो वही परिणाम वापस आ जाता है :

{ "hello": "tyler" }

पूर्ण Drupal कैश साफ़ करना इस समस्या को हल करता है, लेकिन मैं विशेष रूप से इस संसाधन पर कैशिंग अक्षम करना चाहूंगा। मैं उसे कैसे कर सकता हूँ?

वर्कअराउंड के रूप में, मुझे लगा कि क्वेरी स्ट्रिंग में टाइम स्टैम्प जोड़ने से काम चल जाएगा:

http://localhost/example/hello?_format=json&time=123456789

लेकिन यह भी वही परिणाम लौटाता है , कोई फर्क नहीं पड़ता कि क्वेरी स्ट्रिंग में समय स्टाम्प मूल्य क्या है।

संक्षिप्तता के लिए, यहाँ GET संसाधन बनाने के लिए कंकाल कोड है:

class ExampleHello extends ResourceBase {

  /**
   * {@inheritdoc}
   */
  public static function create(/* ... */) {
    return new static(/* ... */);
  }

  /**
   * Constructs a Drupal\rest\Plugin\ResourceBase object.
   */
  public function __construct(/* ... */) {
    parent::__construct(/* ... */);
    // ...
  }

  /*
   * Responds to GET requests.
   */
  public function get() {

    $account = \Drupal::currentUser()->getAccount();
    if (!$account->id()) {
      return new ResourceResponse(array(
        'welcome' => 'visitor'
      ));
    }
    return new ResourceResponse(array(
      'hello' => $account->getAccountName()
    ));
  }

}

क्या जीईटी अनुरोधों पर कैशिंग को अक्षम करने के लिए मुझे इस प्लगइन पर एक कॉन्फ़िगरेशन / सेटिंग की आवश्यकता है?

जवाबों:


16

आप Cacheability के प्रलेखन को पढ़ना चाहते हैं । यह कहता है कि सरणियाँ प्रदान करें, लेकिन यह प्रतिक्रिया वस्तुओं पर भी लागू होती है।

रिसोर्सप्रैस लागू करता है CacheableResponseInterface, जिसमें AddCacheableD निर्भरता विधि है।

यदि किसी भी तरह से संभव है, तो आप कैश को अक्षम करने से बचना चाहते हैं (जो आप कैश की अधिकतम आयु को 0 पर सेट करके करेंगे), लेकिन आवश्यक कैश संदर्भों और कैश टैग्स को जोड़ें।

आपके कैश में, इसका मतलब है कि आपको केवल $ प्रतिक्रिया करने की आवश्यकता है-> addCacheableD dependency ($ खाता)।

आपको getAccount () की भी आवश्यकता नहीं है, बस currentUser () का सीधे उपयोग करें, यह एक प्रॉक्सी है।


3
\Drupalआपको उन जगहों पर उपयोग करने से भी बचना चाहिए जहां आप सेवा को इंजेक्ट कर सकते हैं, जो आपके टिप्पणी कोड के आधार पर लगता है कि आप यहां कर सकते हैं।
mpdonadio

11

मेरी भी यही समस्या थी।

प्रलेखन के माध्यम से पढ़ने और इस पृष्ठ को देखने के बाद, मैं अपने कस्टम समापन बिंदु के लिए कैश को बंद करने में सक्षम था। यहां मेरे एंडपॉइंट के लिए () फंक्शन के अंदर मेरे वर्किंग कोड का एक उदाहरण है:

$build = array(
  '#cache' => array(
    'max-age' => 0,
  ),
);

return (new ResourceResponse($myResponse))->addCacheableDependency($build);

भविष्य के संदर्भ के लिए इसे जोड़ना, आशा है कि यह किसी को भी इसकी आवश्यकता है।

CacheableResponseTrait प्रलेखन पृष्ठ


काम नहीं करता !!!!
पोदोर्क

@podarok - यह मेरे लिए पहले तो काम नहीं किया, फिर एक के बाद एक जारी करने के बाद drush crहर बार काम किया।
tyler.frankenstein

1
एक जादू की तरह काम किया।
मोहम्मद ओसामा गब्रिल

5

मेरे पास भी यही मुद्दा था और इसके लिए समाधान है:

$response->getCacheableMetadata()->addCacheContexts(['url.query_args', 'url.path']);

आप CacheableMetadata और कैश संदर्भ दस्तावेज़ों को भी देख सकते हैं ।

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