ड्रुपल कक्षाओं के ऑटोलॉडिंग को कैसे संभालता है?


10

मॉड्यूल के माध्यम से ड्रुपल कक्षाओं के ऑटोलॉडिंग को कैसे संभालता है? उदाहरण के लिए, यदि मेरे पास एक इवेंट मॉड्यूल है, और मैं ईवेंट नामक एक वर्ग घोषित करता हूं, और फिर .info फ़ाइल में मैं क्लास फ़ाइल शामिल करता हूं, तो यह कैसे पंजीकृत है?

समस्या यह है कि मैं गतिशील रूप से सभी लोड किए गए वर्ग नामों वाली एक सरणी प्राप्त करने की कोशिश कर रहा हूं। get_declared_classes () इस तरह से घोषित किए गए मेरे सभी वर्गों के नाम वापस नहीं करता है, इसलिए मैं मान रहा हूं कि वे किसी भी तरह से ऑटोलॉइड हैं। एक अन्य स्टैक ओवरफ्लो प्रश्न के सुझावों के बाद, मैंने उन सभी को spl_autoload_functions () के साथ प्राप्त करने की कोशिश की , लेकिन वह भी असफल रहा।

कोई विचार?

जवाबों:


13

मॉड्यूल में पुन: निर्मित होने पर .info फ़ाइलों को सूचीबद्ध किया जाता है। (प्रदर्शन की वजहों से उस सूची में केवल परिवर्तित / नई फाइलें हैं)।

यह जानकारी तब {registry}और {registry_files}तालिकाओं में संग्रहीत होती है । इसलिए यदि आप दिए गए नामकरण पैटर्न के अनुसार सभी कक्षाएं या उन प्राप्त करना चाहते हैं, तो आप उन तालिकाओं को क्वेरी कर सकते हैं।


7

Drupal एक कोड रजिस्ट्री रखता है और इसे अपनी कक्षाओं के लिए उपयोग करता है ऑटोलैडर। अपने मॉड्यूल की कक्षाओं के साथ इस रजिस्ट्री को पॉप्युलेट करने के लिए, आपको उनकी फाइलों को .info फ़ाइल में [] प्रविष्टि में जोड़ना चाहिए।

files[] = includes/Foo.inc
files[] = includes/Bar.inc

PHP की क्लास ऑटोलॉडिंग यह सुनिश्चित करेगी कि पैरेंट क्लास फाइल भी भरी हुई हो।

इस उत्तर के लिए उपयोगकर्ता घाट-खरीद का श्रेय, उसी प्रश्न के लिए यहां उसका मूल उत्तर देखें ।

उम्मीद है की वो मदद करदे


5

spl_autoload_functions()के साथ पंजीकृत किया गया है कि ऑटोलॉड कार्यों की सूची देता है spl_autoload_register()। Drupal दो ऑटोलॉड कार्यों को पंजीकृत करता है: एक कक्षाओं के लिए ( drupal_autoload_class () ), और एक इंटरफेस ( drupal_autoload_interface () ) के लिए।

दोनों फ़ंक्शन _registry_check_code () का उपयोग करते हैं ; इसके कोड का उपयोग करके, आप एक फ़ंक्शन लिख सकते हैं जो Drupal 7 मॉड्यूल द्वारा कार्यान्वित सभी वर्गों को सूचीबद्ध करता है।


3

यदि आपने .info फ़ाइल के [] फ़ाइल के सरणी में प्रवेश किया है, तो आपको अपने मॉड्यूल प्रशासन अनुभाग पर जाना होगा और "कॉन्फ़िगरेशन सहेजें" पर क्लिक करना होगा। यह .info जानकारी को ताज़ा करने के लिए ड्रुपल मिलेगा, और नई प्रविष्टियाँ पंजीकृत की जाएंगी।


1

मैंने पाया है कि जानकारी फ़ाइल में मेरी शामिल फ़ाइलों की घोषणा करने से मुझे उन्हें पहचान नहीं मिलती है जब मैं मॉड्यूल चलाना शुरू करता हूं। अगर मेरे पास file event.inc में क्लास इवेंट है। लेकिन मॉड्यूल में एक वस्तु टोकरा, यह मान्यता प्राप्त नहीं है। मैं लाइन जोड़ता हूं

include_once ('CMatArticleHandler.inc');

$ चर = नई घटना () से पहले; लाइन। Im इस पर नया तो वहाँ यह करने के लिए और अधिक हो सकता है, लेकिन यह अब तक काम किया है।


1
वास्तव में दुर्भाग्यपूर्ण है कि लोग केवल यह समझाने के बजाय कि ऐसा करने के लिए क्या करना चाहिए, इससे बचने के लिए इसे कम करते हैं। मैं उसी स्थिति में हूं: ड्रुपल का ऑटोलैडर लगातार एक वर्ग प्राप्त करने के लिए एक फ़ाइल को लोड करने की आवश्यकता को नहीं पहचान रहा है।
ग्रैगल्स

नई कक्षाओं को जोड़ते समय रजिस्ट्री को साफ करना होगा। ड्रू के माध्यम से ओथिस करने का एक आसान तरीका इस आदेश के साथ है: drupal.org/project/registry_rebuild
stefgosselin
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.