तृतीय-पक्ष PHP वर्ग-आधारित लाइब्रेरी के लिए सर्वोत्तम अभ्यास


17

मैं वर्तमान में एक ऐसे मॉड्यूल पर काम कर रहा हूं जिसके लिए एक तृतीय-पक्ष PHP पुस्तकालय की आवश्यकता है, जो अनिवार्य रूप से एक एकल PHP वर्ग है। आम तौर पर, मैं इसे / उपनिर्देशिका में शामिल करूंगा और जोड़ूंगा

files[] = includes/Foo.php

मेरे .info फ़ाइल के लिए और Drupal 7 क्लास ऑटो लोडर को अपनी बात करने दें जब मैं ऐसा करता हूं $foo = new Foo()

हालांकि, मेरे पास इस मॉड्यूल को जनता के लिए जारी करने की अनुमति है, और इसमें लाइब्रेरी को मॉड्यूल के साथ शामिल नहीं किया जाएगा। मैं लाइसेंस के बारे में जटिलताओं के बारे में अच्छी तरह से जानता हूं, लेकिन इस सवाल के लिए, मैं इसे अनदेखा करना चाहूंगा।

एक समान प्रश्न है, मैं एक PHP पुस्तकालय कैसे शामिल करूं? , लेकिन मुझे नहीं लगता कि यह वास्तव में मेरे डिमेमा का जवाब देता है।

इस सवाल का यह उत्तर अनिवार्य रूप से लाइब्रेरीज़ एपीआई का उपयोग करने के लिए कहता है , लेकिन हर एक मॉड्यूल जो मैंने पाया है कि इसका उपयोग बस libraries_get_path()बेसिपथ प्राप्त करने के लिए करता है (और जब यह उपलब्ध नहीं है तो फॉलबैक पथ शामिल है) और फिर कुछ के साथ requireया एक करता है includeत्रुटि जाँच (या नहीं)। सभी कुछ ऐसा करते हैं:

if (!class_exists('Foo')) {
  $path = function_exists('libraries_get_path') ?
    libraries_get_path('foo') : 'sites/all/libraries/foo';
  if (!include($path . '/Foo.php')) {
      // handle this error
  }
}

इस स्थिति में, लायब्रेरी API वास्तव में कुछ भी नहीं कर रहा है। मैं इसका उपयोग करने का लाभ नहीं देखता, उपयोगकर्ताओं को कॉपी डाउनलोड करने और मॉड्यूल फ़ोल्डर में रखने के लिए कहने की पुरानी पद्धति पर। और, अभी भी समस्या है कि मॉड्यूल डेवलपर को अभी भी मैन्युअल रूप से include/ के साथ लोड करने की आवश्यकता है require। उदाहरण के लिए, फेसबुक मॉड्यूल सिर्फ लाइब्रेरी को एक में लोड करता है hook_initऔर HTML प्यूरिफायर मॉड्यूल में लाइब्रेरी की जरूरत होने पर हर बार चेक-एंड-लोड करने के लिए एक आंतरिक फ़ंक्शन होता है।

यह एक व्यापक अभ्यास हो सकता है , लेकिन यह एक सर्वोत्तम अभ्यास नहीं लगता है ।

क्या मेरे मॉड्यूल को पहल करनी चाहिए और hook_libraries_infoमुझे घोषित करना चाहिए कि मैं क्या उपयोग कर सकता हूं libraries_load('foo')? यह भी अजीब लगता है।


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

if (libraries_load($name)) {..}लाइब्रेरी मौजूद न होने की स्थिति में WSOD से बचना एक उद्देश्य है।
donquixote

जवाबों:


7

पुस्तकालयों एपीआई मॉड्यूल की शाखा 2.x डेवलपर्स को हुक_ लाइब्रेरीज़_इनफो () या लाइब्रेरी के लिए .info फ़ाइल के माध्यम से परिभाषित करने की अनुमति देती है , निम्न जानकारी ( पुस्तकालयों को देखें ):

  • पुस्तकालय की निर्भरताएँ
  • वह संस्करण जिसके साथ लाइब्रेरी निर्भर है, प्रत्येक निर्भरता के लिए
  • उन फ़ाइलों की सूची जिन्हें लोड करने की आवश्यकता है (CSS, जावास्क्रिप्ट, या PHP फाइलें)

जिन फ़ाइलों को लोड करने की आवश्यकता होती है, उनकी सूची का उपयोग उन फ़ाइलों को लोड करने के लिए किया जाता है, जब लाइब्रेरी की आवश्यकता होती है। इसका मतलब है कि आपके मॉड्यूल को CSS, और JavaScript फ़ाइलों को लोड करने की आवश्यकता नहीं है drupal_add_css(), या drupal_add_js(), जैसा कि पहले से ही पुस्तकालयों एपीआई मॉड्यूल से किया गया है। लोडिंग निर्भरता पुस्तकालयों एपीआई मॉड्यूल से किया गया एक कार्य है, बिना कॉलिंग मॉड्यूल के कुछ भी नहीं।

पुस्तकालय लोड करने के लिए सभी मॉड्यूल निम्न कोड का उपयोग कर रहा है। ( लाइब्रेरी एपीआई 2.x (मॉड्यूल-डेवलपर के रूप में) देखें ।)

// Try to load the library and check if that worked.
if (($library = libraries_load($name)) && !empty($library['loaded'])) {
  // Do something with the library here.
}

यदि आपको केवल यह पता लगाने की आवश्यकता है कि क्या पुस्तकालय मौजूद है, तो मॉड्यूल को निम्नलिखित के समान कोड का उपयोग करना चाहिए।

if (($library = libraries_detect($name)) && !empty($library['installed'])) {
  // The library is installed.
}
else {
  $error = $library['error'];
  $error_message = $library['error message'];
}

गुणों के बीच hook_libraries_info()वापस आ सकता है, वहाँ भी है 'download url', जो वास्तव में उपयोग नहीं किया जाता है, यहां तक ​​कि शाखा में भी नहीं। 3.x। संभवतः इसका उपयोग भविष्य में किया जाएगा, या एक तृतीय-पक्ष मॉड्यूल पुस्तकालयों एपीआई मॉड्यूल में हुक कर सकता है, और अनुरोध किए गए पुस्तकालयों को डाउनलोड कर सकता है, लेकिन गायब है।


क्या आप किसी भी लोकप्रिय मॉड्यूल को इंगित कर सकते हैं जो PHP पुस्तकालयों के साथ ऐसा करते हैं? प्रश्न के लिए प्रेरणा का एक हिस्सा यह था कि मैं एक सार्वजनिक मॉड्यूल के लिए सर्वोत्तम प्रथाओं का पालन कर सकता था, इसलिए मैंने पुस्तकालयों एपीआई का उपयोग करने वाले लोगों की तलाश करना शुरू कर दिया। मुझे ऐसा कोई भी नहीं मिला, जिसने आंतरिक रूप से hook_lbooks_info () और प्रयुक्त पुस्तकालयों_लोड () का उपयोग किया हो।
mpdonadio

zencorderapi मॉड्यूल (वीडियो मॉड्यूल का हिस्सा) hook_lbooks_info () का उपयोग करता है
AyeshK


@kiamlaluno, धन्यवाद, वह पहला स्थान था जिसे मैंने देखा था। छह में से, केवल दो लाइब्रेरीज़ हुक_ लाइब्रेरीज़_इनफो को लागू करती हैं। मुझे नहीं लगता कि आपका उत्तर गलत है, लेकिन मुझे यकीन नहीं है कि यह अभी एक व्यापक सर्वोत्तम अभ्यास है। पुस्तकालयों में से एक में एक दिलचस्प तकनीक थी जिसे मैं बाहर परीक्षण करने जा रहा हूं और संभवतः बाद में पोस्ट कर सकता हूं।
mpdonadio

@MPD संस्करण 7.x-2.0 29 जुलाई को जारी किया गया है; यह संभव है कि अधिकांश मॉड्यूल अभी भी 7.x-1 दृष्टिकोण का उपयोग कर रहे हैं।
kiamlaluno

5

खुदाई की एक अच्छी मात्रा के बाद, मैं अभी भी इस बारे में असंबद्ध हूं कि सबसे अच्छा अभ्यास क्या है। PHPMailer मॉड्यूल से प्रेरित होकर , मैं वर्ग आधारित PHP पुस्तकालयों के लिए यह पेशकश कर रहा हूं:

function foo_registry_files_alter (&$files, $modules)
{
  if (!class_exists('Foo')) {
    $library_path = function_exists('libraries_get_path') ?
      libraries_get_path('foo') : 'sites/all/libraries/foo';

    $files[$library_path . '/Foo.php'] = array(
      'module' => 'foo',
      'weight' => 0,
    );
  }
}

यह एक वर्ग के अस्तित्व की जांच के लिए हुक_ग्रिस्टि_फाइल्स_ल्टर का उपयोग करता है, और यदि नहीं मिला है, तो एक फ़ाइल को रजिस्ट्री रजिस्ट्री ( files[] = ...एक मॉड्यूल में लाइन के बराबर ) फ़ाइल में जोड़ें। फिर, foo.php में परिभाषित कक्षाएं ऑटोलैडर के साथ उपलब्ध होंगी, इसलिए कक्षा का उपयोग करने से पहले फ़ाइल को स्पष्ट रूप से लोड करने की आवश्यकता नहीं है।

यह पुस्तकालयों एपीआई पर एक नरम आवश्यकता भी बनाता है, और यदि उपलब्ध हो तो इसका उपयोग करेगा, अन्यथा एक उचित डिफ़ॉल्ट का उपयोग करें।

यह सुनिश्चित करने के लिए कि फ़ाइल मौजूद है, यह सुनिश्चित करने के लिए एक हुक_requirements के माध्यम से कुछ चेक जोड़ना , कि ऑटोलैडर को कक्षा, संस्करण की जांच आदि का पता चलता है, यह भी एक अच्छा विचार है।

यह भी ध्यान देने योग्य है कि पुस्तकालयों एपीआई के लिए एक ऑटोलैड दृष्टिकोण मुद्दे की कतार में चर्चा की जा रही है।


हुक लगाने के बाद अपना कैश साफ़ करना न भूलें। अन्यथा, यह ट्रिगर नहीं होगा;)
सादालुलु

2

संक्षेप में: यदि आप सार्वजनिक रूप से मॉड्यूल जारी करने की योजना बना रहे हैं और (थर्ड पार्टी) लाइब्रेरी GPL'd नहीं है, तो आपको पुस्तकालयों का उपयोग एक निर्भरता के रूप में करना होगा या उपयोगकर्ताओं से इन फ़ाइलों को मैन्युअल रूप से डाउनलोड करने के लिए कहेंगे (लेकिन आप सक्षम नहीं होंगे) इसे .info फ़ाइल से ऑटोलॉड करें)

थोड़ी देर में:

लाइब्रेरी मॉड्यूल की आवश्यकता के कारण मूल रूप से लाइसेंसिंग है। कोई फर्क नहीं पड़ता कि आप उस मॉड्यूल का उपयोग करते हैं या नहीं, आप किसी तरह से उस फ़ाइल को शामिल कर रहे हैं।

वैसे मुझे लगता है कि आपको इस तरह के पुस्तकालयों के लिए अच्छे उदाहरण नहीं मिले हैं-साथ-साथ-मामले। SMTP मॉड्यूल की जाँच करें और यह आवश्यक वर्गों के साथ आता है क्योंकि यह GPL में है। ( .info फ़ाइल ब्लॉब )।

इसके अलावा सिंपलमैडलोम मॉड्यूल देखें, जिसमें सिर्फ फाइल ही शामिल है, लेकिन और कुछ नहीं।

जहां लाइब्रेरी मॉड्यूल काम आता है, आप उपयोगकर्ताओं से फाइल को कहीं भी अपलोड करने के लिए कह सकते हैं। यह स्पष्ट नहीं है कि उपयोगकर्ता इसे साइटों / सभी / पुस्तकालयों फ़ोल्डर में अपलोड करेंगे। यह साइट्स / example.com / लाइब्रेरी या ऐसा कुछ हो सकता है। लाइब्रेरी मॉड्यूल आपके लिए निर्देशिका खोज सामान का काम करके अपने वास्तविक काम पर ध्यान केंद्रित करने में आपकी मदद कर सकता है।

अपने ग्राहकों के लिए विकसित होने वाले कस्टम मॉड्यूल के लिए, मैं आमतौर पर मॉड्यूल फ़ोल्डर में फ़ाइलों को शामिल करता हूं और लाइब्रेरी के उपयोग के आधार पर requ_once या .info फ़ाइल प्रविष्टि का उपयोग करता हूं।

साथ ही, लायब्रेरीज़ मॉड्यूल का उपयोग करने के लिए लाइसेंसिंग समस्याएं एकमात्र कारण नहीं हैं। क्या होगा यदि तीसरे पक्ष के पुस्तकालय में तेजी से रिलीज चक्र हो और आपका मॉड्यूल न्यूनतम रूप से विकसित हो? यदि आप इसे मॉड्यूल में शामिल करते हैं, तो आपको हर बार एक नया रिलीज़ करना होगा। आप एक रिलीज नहीं करना चाहेंगे 7.x-1.99 जो 7.x-1.0 i अनुमान से काफी मिलता-जुलता है।


जवाब देने में व़क्त लेने के लिए शुक्रिया। मैंने अपने प्रश्न को स्पष्ट करने के लिए थोड़ा संपादित किया। सवाल वास्तव में लाइसेंसिंग और रिलीज शेड्यूल की जटिलताओं के बारे में नहीं है, और लाइब्रेरी एपीआई इस बारे में कैसे मदद करता है। मैं वास्तव में तीसरे पक्ष के पुस्तकालयों को लोड करने के बारे में सर्वोत्तम प्रथाओं के बारे में अधिक उत्सुक हूं।
mpdonadio

2

ऐसा लगता है कि प्रमुख समस्या ऑटोलैड है।

आप पुस्तकालयों मॉड्यूल प्लस xautoload मॉड्यूल का उपयोग कर सकते हैं ।

फिर अपने मॉड्यूल में, आप करते हैं

function mymodule_libraries_info() {

  return array(
    'mymodule-test-lib' => array(
      'name' => 'My test library',
      ..
      'xautoload' => function($api) {
        // Register a namespace with PSR-0 root in <library dir>/lib/
        // Note: $api already knows the library directory.
        // Note: We could omit the 'lib', as this is the default value.
        $api->namespaceRoot('XALib\TestNamespace', 'lib');
      },
    ),
  );
}

यह यहाँ और अधिक विस्तार से समझाया गया है:
xautoload.api.php
$ एपीआई तर्क के बारे में अधिक।

नोट: आप PSR-0 या PEAR से परे अधिक विदेशी पुराने स्कूल पैटर्न को लागू करने के लिए, अपने स्वयं के "हैंडलर" भी लिख सकते हैं। यदि आपको इसके लिए मदद चाहिए, तो xautoload कतार पर एक समस्या पोस्ट करें।

नोट: आपके लाइब्रेरी नेमस्पेस को पंजीकृत करने का एक से अधिक तरीका है। यह सबसे आसान है, यदि आप चाहते हैं कि नाम स्थान हर अनुरोध में पंजीकृत हो।


1
मुझे जोड़ना चाहिए, यह प्रक्रियात्मक फ़ाइलों को लोड करने में मदद नहीं करता है। जैसे ही आपको एक अनुरोध में पुस्तकालय की आवश्यकता होती है, इसे मैन्युअल रूप से किया जाना चाहिए।
दान

इसके अलावा, कुछ पुस्तकालयों का अपना वर्ग लोडिंग समाधान है। फिर भी, Drupal / contrib में पहले से उपलब्ध लोडर का उपयोग करना अधिक सुविधाजनक हो सकता है।
दान
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.