एक्सेस जाँच + कैश करने योग्यता
Мар्ग एक्सेस चेकर, hook_entity_access() और वे सब कुछ, जिन्हें AccessResultInterface ऑब्जेक्ट लौटाने की आवश्यकता होती है, उन्हें उपयुक्त कैश करने योग्य मेटाडेटा जोड़ना चाहिए।
अगर आपने अभी तक नहीं पढ़ा है, तो cache tags, cache contexts और max-age पढ़ें।
एक्सेस चेक पैरामीटर
एक्सेस चेकर को विभिन्न पैरामीटर मिलेंगे — कम से कम एक उपयोगकर्ता खाता (AccountInterface) और अक्सर एक ऑब्जेक्ट। फिर यह उन पैरामीटरों के गुणों के आधार पर निर्णय लेगा।
यदि किसी पैरामीटर की किसी प्रॉपर्टी में बदलाव एक्सेस परिणाम को बदल देता है, तो उस $parameter को कैश करने योग्य निर्भरता के रूप में जोड़ा जाना चाहिए।
उदाहरण:
$access_result = AccessResult::allowedIf($node->isPublished()) // एक्सेस परिणाम ऑब्जेक्ट की प्रॉपर्टी पर निर्भर करता है जो बदल सकती है: यह एक कैश करने योग्य निर्भरता है। ->addCacheableDependency($node);
एक और आम स्थिति तब होती है जब एक्सेस परिणाम उस प्रॉपर्टी पर निर्भर करता है जो कभी नहीं बदल सकती (आमतौर पर ID, UUID)। उदाहरण के लिए, एक्सेस की अनुमति दें यदि दिया गया यूजर अकाउंट उस ऑब्जेक्ट का ओनर है:
$access_result = AccessResult::allowedIf($node->getOwnerId() === $account->id())
// एक्सेस परिणाम नोड के ओनर पर निर्भर करता है, और ओनर बदल सकता है।
->addCacheableDependency($node);
// एक्सेस परिणाम यूजर अकाउंट पर भी निर्भर करता है, और यूजर अकाउंट की ID कभी नहीं बदल सकती।
// इसलिए हमें $account को कैश करने योग्य निर्भरता के रूप में जोड़ने की ज़रूरत नहीं है।
// लेकिन अगर $account वर्तमान यूजर है, और कोई हार्डकोडेड यूजर नहीं है, तो हमें यह सुनिश्चित करना होगा कि यह वर्तमान यूजर के हिसाब से वेराई करे,
// ताकि हम इस एक्सेस चेक को एक बार न चलाएँ और फिर सभी यूजरों के लिए उसका परिणाम न इस्तेमाल करें।
if ($account->id() === \Drupal::currentUser()->id()) {
$access_result->cachePerUser();
}