তৃতীয় পক্ষের পিএইচপি শ্রেণিবদ্ধ লাইব্রেরির জন্য সেরা অনুশীলন


17

আমি বর্তমানে একটি মডিউলে কাজ করছি যার জন্য তৃতীয় পক্ষের পিএইচপি লাইব্রেরি প্রয়োজন, যা মূলত একক পিএইচপি ক্লাস। সাধারণত, আমি এটিকে একটি অন্তর্ভুক্ত / উপ-ডিরেক্টরিতে যুক্ত করব এবং যুক্ত করব

files[] = includes/Foo.php

আমার .info ফাইলটিতে এবং ড্রুপাল 7 শ্রেণীর অটো লোডারকে এটি করতে দিন যখন আমি একটি করি $foo = new Foo()

যদিও আমার কাছে এই মডিউলটি জনসাধারণের কাছে প্রকাশ করার অনুমতি রয়েছে এবং মডিউলটি সহ লাইব্রেরিটি অন্তর্ভুক্ত করা উচিত নয়। লাইসেন্স সংক্রান্ত জটিলতাগুলি সম্পর্কে আমি ভালভাবে সচেতন, তবে এই প্রশ্নের খাতিরে, আমি এড়াতে চাই।

একটি অনুরূপ প্রশ্ন আছে, আমি কীভাবে পিএইচপি লাইব্রেরি অন্তর্ভুক্ত করব? , তবে আমি সত্যিই ভাবি না এটি আমার দ্বিধাটির জবাব দেয়।

এই প্রশ্নের উত্তরটি মূলত গ্রন্থাগারগুলির এপিআই ব্যবহার করতে বলে , তবে আমি যে প্রতিটি একক মডিউল পেয়েছি তা 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
  }
}

এই ক্ষেত্রে, গ্রন্থাগারগুলির এপিআই সত্যই কিছু করছে না। ব্যবহারকারীদের একটি অনুলিপি ডাউনলোড করতে এবং এটি নিজেই মডিউল ফোল্ডারে রাখার পুরানো পদ্ধতির চেয়ে এটি ব্যবহার করার সুবিধাটি আমি দেখতে পাচ্ছি না। এবং, মডিউল বিকাশকারীকে এখনও / দ্বারা লোডটি ম্যানুয়ালি করা দরকার এখনও আছে । উদাহরণস্বরূপ, ফেসবুক মডিউলটি কেবলমাত্র একটিতে লাইব্রেরি লোড করে এবং এইচটিএমএল পিউরিফায়ার মডিউলটির প্রতিটি সময় লাইব্রেরির প্রয়োজন হয় তা পরীক্ষা করে লোড করার জন্য একটি অভ্যন্তরীণ ফাংশন থাকে।includerequirehook_init

এটি একটি বিস্তৃত অনুশীলন হতে পারে তবে এটি সর্বোত্তম অনুশীলনের মতো বলে মনে হচ্ছে না ।

আমার মডিউলটি কি উদ্যোগ নিতে হবে এবং hook_libraries_infoআমি libraries_load('foo')কীভাবে ব্যবহার করতে পারি তা ঘোষণা করা উচিত ? এটিও অদ্ভুত বলে মনে হচ্ছে।


আর একটি বিষয় তৃতীয় পক্ষের লাইব্রেরির লাইসেন্স ড্রুপালের সাথে মেলে কিনা। যদি এটি হয়, এবং এটি বিশাল নয়, আমি কেবল এটি অন্তর্ভুক্ত করব। যদি এটি না ঘটে তবে আপনি এটি শুরু করার সাথে অন্তর্ভুক্ত করতে পারবেন না, সুতরাং লাইব্রেরির পন্থাটি আরও ভাল বলে মনে হচ্ছে এবং আপনার শেষ ব্যবহারকারীরা এটি নিজেই ডাউনলোড করুন।
জিমাজাম্মা

এর একটি উদ্দেশ্য if (libraries_load($name)) {..}লাইব্রেরির উপস্থিতি না থাকলে ডাব্লুএসওডি এড়ানো।
donquixote

উত্তর:


7

লাইব্রেরিগুলির এপিআই মডিউলের 2.x শাখা বিকাশকারীদের মাধ্যমে সংজ্ঞা দিতে পারে hook_libraries_info () এর বা লাইব্রেরির জন্য একটি .info ফাইলের মাধ্যমে নিম্নলিখিত তথ্য ( লাইব্রেরি.এপিআই দেখুন ) :

  • গ্রন্থাগারের নির্ভরতা
  • প্রতিটি নির্ভরতার জন্য গ্রন্থাগারটি সামঞ্জস্যপূর্ণ সংস্করণ
  • যে ফাইলগুলি লোড করা দরকার তার তালিকা (সিএসএস, জাভাস্ক্রিপ্ট, বা পিএইচপি ফাইল)

যে লাইব্রেরির প্রয়োজন হয় সেই ফাইলগুলি লোড করতে প্রয়োজনীয় ফাইলগুলির তালিকা ব্যবহার করা হয়। এর অর্থ হল আপনার মডিউলটির সাথে সিএসএস, এবং জাভাস্ক্রিপ্ট ফাইল লোড করার দরকার নেইdrupal_add_css() বা drupal_add_js()যেমন ইতিমধ্যে গ্রন্থাগারগুলির এপিআই মডিউলটি থেকে সম্পন্ন হয়েছে। নির্ভরতা লোড করা কলিং মডিউলটি কিছু না করেই গ্রন্থাগারগুলির এপিআই মডিউল থেকে করা একটি কাজ।

সমস্ত মডিউলটি লাইব্রেরি লোড করার জন্য নিম্নলিখিত কোডটি ব্যবহার করছে। ( লাইব্রেরি এপিআই ২.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। সম্ভবত এটি ভবিষ্যতে ব্যবহার করা হবে বা তৃতীয় পক্ষের মডিউলগুলি গ্রন্থাগারগুলির এপিআই মডিউলটিতে প্রবেশ করতে পারে এবং অনুরোধ করা লাইব্রেরিগুলি ডাউনলোড করতে পারে তবে নিখোঁজ রয়েছে।


আপনি কি কোনও জনপ্রিয় মডিউলগুলি চিহ্নিত করতে পারেন যা এইচএইচপি লাইব্রেরি সহ করে? প্রশ্নের অনুপ্রেরণার অংশটি ছিল যাতে আমি সর্বজনীন মডিউলের জন্য সর্বোত্তম অনুশীলনগুলি অনুসরণ করতে পারি, তাই আমি লাইব্রেরি এপিআই ব্যবহার করে এমনগুলি সন্ধান করতে শুরু করি। আমি অভ্যন্তরীণভাবে hook_libraries_info () প্রয়োগ করা লাইব্রেরি_লোড () ব্যবহার করে এমন কোনও সন্ধান পাইনি।
এমপিডোনাদিও

জেনকার্ডেরাপি মডিউল (ভিডিও মডিউলের অংশ) hook_libraries_info () ব্যবহার করে
আয়েশক

@ এমপিডি লাইব্রেরি এপিআই ব্যবহার করে অবদানীকৃত মডিউলগুলির উদাহরণগুলির উপর একটি আংশিক তালিকা রয়েছে ।
কিমলালুনো

@ কিয়ামলালুনো, ধন্যবাদ, আমি প্রথম দেখলাম। ছয়টির মধ্যে কেবল দুটি লাইব্রেরিই হুক_লাইব্রিজারি_আইনফো বাস্তবায়ন করে। আপনার উত্তরটি ভুল বলে আমি মনে করি না, তবে আমি নিশ্চিত নই যে এটি এখনই একটি বিস্তৃত সেরা অনুশীলন। একটি লাইব্রেরির একটি আকর্ষণীয় কৌশল ছিল যা আমি পরীক্ষা করতে যাচ্ছি এবং সম্ভবত পরে পোস্ট করব।
এমপিডোনাদিও

@ এমপিডি সংস্করণ 7.x-2.0 প্রকাশিত হয়েছে 29 জুলাই; এটি সম্ভবত সম্ভবত বেশিরভাগ মডিউল 7.x-1 পদ্ধতির ব্যবহার করছে using
কিমলালুনো

5

খননের একটি শালীন পরিমাণ পরে, আমি এখনও সর্বোত্তম অনুশীলন কী তা সম্পর্কে আপত্তিহীন। পিএইচপিমেইলার মডিউল দ্বারা অনুপ্রাণিত হয়ে , আমি এটি ক্লাস ভিত্তিক পিএইচপি লাইব্রেরির জন্য দিচ্ছি:

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,
    );
  }
}

এটি কোনও শ্রেণীর অস্তিত্ব পরীক্ষা করার জন্য hook_registry_files_alter ব্যবহার করে এবং যদি খুঁজে না পাওয়া যায় তবে শ্রেণি রেজিস্ট্রিতে একটি ফাইল যুক্ত করুন ( files[] = ...একটি মডিউল .info ফাইলের একটি লাইনের সমতুল্য )। তারপরে, foo.php এ সংজ্ঞায়িত ক্লাসগুলি অটোলোডারের সাথে উপলব্ধ থাকবে, সুতরাং ক্লাসটি ব্যবহারের আগে স্পষ্টভাবে ফাইলটি লোড করার প্রয়োজন নেই।

এটি লাইব্রেরি এপিআই-তে একটি নরম প্রয়োজনীয়তাও তৈরি করে এবং এটি উপলব্ধ থাকলে এটি ব্যবহার করবে, অন্যথায় যুক্তিসঙ্গত ডিফল্ট ব্যবহার করবে।

ফাইল উপস্থিত রয়েছে কিনা তা নিশ্চিত করার জন্য একটি অদৃশ্য_ প্রয়োজনীয়তার মাধ্যমে কিছু চেক যুক্ত করা, অটোলোডারের ক্লাস, সংস্করণ চেক ইত্যাদির সন্ধান করে তাও একটি ভাল ধারণা।

এটিও লক্ষণীয় যে লাইব্রেরি এপিআইয়ের জন্য একটি অটোলোড পদ্ধতির বিষয়টি ইস্যু কাতারে আলোচনা করা হচ্ছে


Hook_registry_files_alter প্রয়োগের পরে আপনার ক্যাশে সাফ করতে ভুলবেন না, অন্যথায় এটি ট্রিগার করবে না;)
সাদুলুলু

2

সংক্ষেপে: আপনি যদি জনসাধারণের কাছে মডিউল প্রকাশ করার পরিকল্পনা করছেন এবং (তৃতীয় পক্ষের) লাইব্রেরিটি জিপিএল না হয়, আপনার গ্রন্থাগারগুলি নির্ভরতা হিসাবে ব্যবহার করতে হবে বা ব্যবহারকারীদের এই ফাইলগুলি ম্যানুয়ালি ডাউনলোড করতে বলা হবে (তবে আপনি সক্ষম হবেন না) .info ফাইল থেকে এটি অটোলোড করুন)

অল্প সময়ের মধ্যে:

আমাদের লাইব্রেরি মডিউলটির প্রয়োজনীয়তার কারণটি মূলত লাইসেন্সিং। আপনি সেই মডিউলটি ব্যবহার করেন বা না করেন তা আপনি কোনওভাবেই সেই ফাইলটি অন্তর্ভুক্ত করছেন।

ভাল আমি মনে করি আপনি এই ধরণের লাইব্রেরিগুলির জন্য-মডুলুল মামলার সাথে ভাল পাঠানো উদাহরণ খুঁজে পান নি। পরীক্ষা করে দেখুন SMTP এর মডিউল এবং এটি জিপিএল এর এটা প্রয়োজনীয় শ্রেণীর দিয়ে আসে। ( .info ফাইল ব্লব )।

সিম্পিটমলডম মডিউলটিও দেখুন যা কেবলমাত্র ফাইলটি অন্তর্ভুক্ত করে তবে অন্য কিছুই নয়।

যেখানে লাইব্রেরিগুলির মডিউলটি কার্যকর হয়, আপনি ব্যবহারকারীদের যে কোনও জায়গায় ফাইল আপলোড করতে বলতে পারেন। এটি স্পষ্ট নয় যে ব্যবহারকারীরা এটি সাইট / সমস্ত / লাইব্রেরি ফোল্ডারে আপলোড করবেন। এটি সাইট / উদাহরণ.কম / লাইব্রেরি বা এর মতো কিছু হতে পারে। লাইব্রেরি মডিউল আপনার জন্য ডিরেক্টরি আবিষ্কার স্টাফ করে আপনার প্রকৃত কাজে মনোনিবেশ করতে সহায়তা করতে পারে।

আমি আমার ক্লায়েন্টদের জন্য বিকাশিত কাস্টম মডিউলগুলির জন্য, আমি সাধারণত মডিউল ফোল্ডারে ফাইলগুলি অন্তর্ভুক্ত করি এবং লাইব্রেরির ব্যবহারের উপর নির্ভর করে প্রয়োজনীয়_অনস বা .info ফাইল এন্ট্রি ব্যবহার করি।

এছাড়াও, লাইসেন্সিংয়ের সমস্যাগুলি শুধুমাত্র লাইব্রেরি মডিউল ব্যবহারের কারণ নয়। তৃতীয় পক্ষের গ্রন্থাগারে যদি দ্রুত প্রকাশের চক্র থাকে এবং আপনার মডিউলটি ন্যূনতম বিকাশিত হয় তবে কী হবে? আপনি যদি এটি মডিউলে অন্তর্ভুক্ত করেন তবে আপনাকে প্রতিবার একটি নতুন প্রকাশ করতে হবে। আপনি 7.x-1.99 প্রকাশ করতে চাইবেন না যা আমার অনুমান 7.x-1.0 এর সাথে অনেকটা সাদৃশ্যপূর্ণ।


উত্তর দেওয়ার জন্য সময় দেওয়ার জন্য ধন্যবাদ। আমি আমার প্রশ্নটি একটু স্পষ্ট করতে সম্পাদনা করেছি rif লাইসেন্সটি লাইসেন্স ও প্রকাশের সময়সূচীর জটিলতা এবং লাইব্রেরি এপিআই কীভাবে এতে সহায়তা করে তা নিয়ে প্রশ্নটি আসলে নয়। আমি আসলে তৃতীয় পক্ষের লাইব্রেরিগুলি লোড করা সম্পর্কে সেরা অনুশীলন সম্পর্কে আরও আগ্রহী।
এমপিডোনাদিও

2

মনে হচ্ছে বড় সমস্যাটি অটোলোড olo

আপনি লাইব্রেরি মডিউল প্লাস 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
$ এপিআই যুক্তি সম্পর্কে আরও।

দ্রষ্টব্য: পিএসআর -0 বা পিয়ারের বাইরে আরও বহিরাগত ও পুরানো-স্কুল নিদর্শনগুলি প্রয়োগ করতে, আপনি নিজের "হ্যান্ডলারগুলি "ও লিখতে পারেন। যদি আপনার এটির সাহায্যের প্রয়োজন হয় তবে xautoload কাতারে একটি সমস্যা পোস্ট করুন।

দ্রষ্টব্য: আপনার গ্রন্থাগারের নেমস্পেসগুলি নিবন্ধ করার একাধিক উপায় রয়েছে is আপনি যদি প্রতিটি অনুরোধে নেমস্পেসগুলি নিবন্ধিত করতে চান তবে এটি সবচেয়ে সহজ।


1
আমার যুক্ত করা উচিত, এটি পদ্ধতিগত ফাইলগুলি লোড করতে সহায়তা করে না। একটি অনুরোধে লাইব্রেরিটি করার সাথে সাথে এটি ম্যানুয়ালি করা দরকার।
donquixote

এছাড়াও, কিছু লাইব্রেরির নিজস্ব শ্রেণি লোডিং সমাধান রয়েছে। তবুও, ড্রুপাল / অবদানের মধ্যে ইতিমধ্যে উপলব্ধ লোডার ব্যবহার করা আরও সুবিধাজনক হতে পারে।
donquixote
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.