আমি কীভাবে উপলব্ধ পাবলিক পদ্ধতিগুলি খুঁজে পাব?


9

আমি খুঁজে পেয়েছি যে ড্রুপাল 8 এর সাথে কাজ করার ক্ষেত্রে সবচেয়ে বড় সমস্যাটি হ'ল আমি যা প্রয়োজন তার ডেটা পেতে পারি না। ড্রুপাল 8 চায় যে আমি কোনও বস্তুর মাধ্যমে ম্যানুয়ালি ড্রিলিংয়ের চেয়ে পাবলিক পদ্ধতিগুলি ব্যবহার করব। সমস্যাটি হচ্ছে, উপলভ্য পদ্ধতির তালিকা পাওয়ার জন্য আমি একটি সুসংগত উপায় বের করতে পারি না! (এগুলি যাদুকরিরূপে বিদ্যমান এবং আমার মনে হয় আমি কেবল তাদের সম্পর্কে জানার কথা) =

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

সুতরাং আমি একটি নোড আইডি দিয়ে শুরু করব (id nid), এবং কোনওভাবে আমাকে নোডটি কীভাবে লোড করতে হবে তা নির্ধারণ করতে হবে। এটি খুব খারাপ নয় কারণ প্রচুর উদাহরণ রয়েছে। তাই আমি এরকম কিছু করি $node = \Drupal\node\Entity\Node::load($nid);

এ পর্যন্ত সব ঠিকই. তারপরে আমার ভিডিও ক্ষেত্রের মান (ফিল্ড_মাইন_ভিডিও) পাওয়া দরকার। এটি নির্ণয় করতে আমাকে আরও সময় লাগল কারণ 'জালের চারপাশে বিবাদী ডকুমেন্টেশন রয়েছে। অবশেষে আমি বুঝতে পারলাম আমাকে এরকম কিছু করতে হবে (কারণ এটি একটি মাল্টিভ্যালু আইটেম):

$video = \Drupal\node\Entity\Node::load($nid)->field_main_video->getValue();

... তারপরে অ্যারে থেকে লুপ করুন। কিন্ত ব্যবহার করা আমাকে এটির সন্ধান করতেও সহায়তা করেনি। কারণ, উদাহরণস্বরূপ, যদি আমি kint($node)এবং পদ্ধতির অধীনে নজর রাখি তবে আমি getValue () কে সেখানে কোনও আইটেম হিসাবে দেখছি না। এখনও ভয়ানক নয়, কারণ এটি বের করার জন্য চারপাশে পর্যাপ্ত উদাহরণ ছিল।

যদিও আমি আরও গভীরতর হই, তবে আমি যা জানতাম না (এটি গুরুত্বপূর্ণ অংশ) তা হ'ল ভিডিও ফিল্ড সত্তা আইডি পাওয়ার চেয়ে সত্তাটি লোড করা, তারপরে সত্তায় "ইউরি" ক্ষেত্র সন্ধান করা ইত্যাদি (যেমন আমি ডি 7 এ যাব): একটি পদ্ধতি ছিল যা আমাকে একই কোডের এই লাইনে ইউআরআই পেতে দেয়!

$url = \Drupal\node\Entity\Node::load($nid)->field_main_video->entity->getFileUri();

তবে কীভাবে আমি এই getFileUri () এর অস্তিত্ব জানতে পারতাম? আমি এটি একটি ব্লগ পোস্টে হোঁচট খেতে ঘটেছে। এটি সত্যই ডি 7 এর চেয়ে বেশি ইউআরআই পাওয়া সহজ করে তোলে ... তবে কেবলমাত্র যদি আপনি জানেন (যাদুতে) কোনও অবজেক্টের প্রতিটি 'স্তরের' জন্য কোন পদ্ধতি বিদ্যমান exist

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


1
সরকারী ডকুমেন্টেশনটি api.drupal.org এ রয়েছে। আপনি যে জিনিসটি পরিচালনা করছেন তার শ্রেণিটি একবার বুঝতে পারলে, উত্তরাধিকারসূত্রে প্রাপ্ত সমস্ত পদ্ধতি আপনি পেয়ে যাবেন।
কিমলালুনো

1
... তবে api.drupal.org- এ সমস্ত কিছু দেখার চেয়ে অবশ্যই পিএইচপি / ডেভেল-এর কোনও উপায় আছে যে কমান্ডের স্ক্রিনে উপলভ্য পদ্ধতিগুলি ফেলে দেওয়া যায়?
ববি

উত্তর:


14

বিষয়বস্তু সত্ত্বা যে, তারা ঘন ঘন সবচেয়ে অন্যান্য বিষয়ের থেকে ভিন্ন না অন্তত কনফিগার ক্ষেত্রের জন্য না, পদ্ধতি ও সঠিক ইন্টারফেসের আছে।

বিষয়বস্তু সত্তা এবং ক্ষেত্রগুলির ক্ষেত্রে, সর্বজনীন পদ্ধতিগুলি আসলে যা আপনি আসলে জানতে চান তা নয়, আপনি যা চান তা ক্ষেত্র এবং সম্পত্তি সম্পর্কে জেনে রাখা উচিত। এবং কেবলমাত্র আপনি যখন কোনও সত্তার কাছে পুনরায় কোনও রেফারেন্সের মাধ্যমে পৌঁছান তখন পদ্ধতিগুলি গুরুত্বপূর্ণ।

ওভারভিউয়ের জন্য, আমি সর্বদা দুর্দান্ত সত্ত্বা এপিআই চিট শীটটি উল্লেখ করি

সামগ্রী সত্তাগুলির একটি নির্দিষ্ট কাঠামো, সত্ত্বা> ক্ষেত্র (ফিল্ডআইটেমলিস্ট)> ফিল্ড আইটেম -> সম্পত্তি রয়েছে। একটি সম্পত্তি হয় স্কেলার বা অন্য কোনও কিছুতে যেমন রেফারেন্স, যেমন অন্য কোনও সত্তা, একটি ভাষা অবজেক্ট, একটি তারিখের অবজেক্ট, ...

কয়েকটি নির্দিষ্ট উদাহরণের জন্য, কিছু দরকারী স্নিপেটগুলি:

// List of fields that an entity has, the field definitions also have a lot of information like the type.
array_keys($entity->getFieldDefinitions())

// Use get() instead of the magic __get() on the entity level then you at least get some type hints.
$entity->get('field_name').

// Get the list of properties a certain field has, use array_keys() again for just the names, but the definitions also have the type and if it's computed or not.
$entity->getFieldDefinition('field_name')->getFieldStorageDefinition()->getPropertyDefinitions()

// Most field types have value property, but e.g. entity references have target_id and the computed entity. as you found. File and Image fields have additional properties like title/alt/description.
$entity->get('field_name')->value
$entity->get('field_name')->target_id
$entity->get('field_name')->entity

// Note that get('value') is not the same as ->value on the field item level, get() returns a typed data object, get('value')->getValue() is the same as ->value.

// When not specified, the delta 0 is assumed (all fields are a list internally, even something like the node id), you can use array access or the delta to access another delta, make sure it exists.
$entity->get('field_name')[1]->value
$entity->get('field_name')->get(1)->value

// When you have an entity reference, you can get the entity type and class like this:
$entity->get('field_name')->entity->getEntityTypeId()
$entity->get('field_name')->entity->getEntityType()->getClass()
// or 
get_class($entity->get('field_name')->entity)

// From there you can look up the interface and type hint against that, to a) make sure you have a valid, loadable reference and get type hints in an IDE:
$file = $entity->get('field_name')->entity;
if ($file instanceof \Drupal\file\FileInterface) {
  $file->getFileUri();
}

নিস! এটি হজম করতে খানিকটা সময় নিতে চলেছে, তবে আমি এটি গ্রহণযোগ্য উত্তর হওয়ার দিকে ঝুঁকছি। ধন্যবাদ! এটি ঠিক প্রশ্নের উত্তর দেয় না তবে কেবলমাত্র আমার প্রশ্ন এবং আমার উদাহরণটি 2 বিভিন্ন জিনিস জিজ্ঞাসা করার কারণ ছিল। ধন্যবাদ!
ববি

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

4

নিশ্চিত না যে এটি আপনার প্রশ্নের সম্পূর্ণরূপে উত্তর দেবে তবে পিএইচপিস্টোরমে ডায়াগ্রাম বৈশিষ্ট্যটি আমাকে কী সাহায্য করে তা আমাকে অনেকটাই সহায়তা করে।

উদাহরণস্বরূপ শ্রেণিবিন্যাস দেখানো এখানে চিত্র বর্ণনা লিখুন

আপনার কাছে পদ্ধতির নামও দেখানোর বিকল্প রয়েছে

এখানে চিত্র বর্ণনা লিখুন

আমি আশা করি এটি আপনাকে একটি উপায়ে সহায়তা করবে।


আপনি ইউএমএল না খুলে দ্রুত একই তথ্য স্ক্যান করতে ক্লাস স্ট্রাকচারটি (যেখানে আপনার প্রকল্পের ডিরেক্টরি দেখুন হবে) দেখতে ক্লাস স্ট্রাকচারটি দেখতে কমান্ড + ক্লিক, তারপরে কমান্ড + 7 বা স্ট্রাকচার ট্যাবে ক্লিক করতে পারেন a
কেভিন

আমি পিএইচপিস্টর্ম ব্যবহার করি না, তবে ভবিষ্যতের রেফারেন্সের জন্য এটি জানা ভাল। আমি ডেভেল বা ড্রুপাল কেন্দ্রিক কিছু ব্যবহার করে এটি করার উপায় খুঁজছি। নিশ্চয়ই কোথাও কিছু তৈরি করা উচিত?
ববি

আমি এটি বলার জন্য দুঃখিত, তবে আমি সত্যিই এই মুহুর্তে ভাবি না আপনি এই আইডিইটি ব্যবহার না করে আপনি দক্ষতার সাথে এপিআইয়ের সাথে টিঙ্কার করতে পারেন।
ওলেগ ভিদেনভ

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

তাদের লবণের মূল্যের কোনও আইডিই এটি করতে পারে। বিটিডাব্লু পিএইচপিএসটর্মটি ব্যয়বহুল নয় যদি আপনি যা অফার করেন তা ব্যবহার করেন। আপনি ফ্রি ইএপি সংস্করণ ব্যবহার করতে পারেন এবং আপনি যদি ওপেন সোর্স প্রকল্পে (ড্রুপাল মডিউল বা থিম) কাজ করেন, জেটব্রেইন আপনাকে একটি নিখরচায় লাইসেন্স দেবে। যদিও এখানে জন্য আলোচনা নয়।
কেভিন

4

ঠিক আছে, আমি নিজেকে প্রায়শই var_dump(get_class_methods($object))প্রদত্ত শ্রেণীর জন্য উপলব্ধ পদ্ধতির তালিকা রাখার সংমিশ্রণটি ব্যবহার করে দেখতে পেলাম ।

আমি api.drupal.orgআরও বিশদ জন্য প্রায়শই সন্ধান করা ।


2
এটি মনে হচ্ছে উত্তরটি এতদূর ঘনিষ্ঠভাবে সম্পর্কিত যা আমি এতক্ষণ খুঁজছিলাম to ধন্যবাদ!
ববি

0

আপনি ইতিমধ্যে খুব কাছাকাছি।

প্রথমে আসুন পদ্ধতির সংজ্ঞাটি দেখুন: https://api.drupal.org/api/drupal/core%21modules%21file%21src%21Entity%21File.php/function/File%3A%3AgetFileUri/8.2.x

এখান থেকে আমরা ক্লাসটি দেখতে পাচ্ছি এটির একটি অংশ এটির একটি লিঙ্ক রয়েছে:

Class

File
Defines the file entity class.

এর মাধ্যমে ক্লিক করা আমাদের এখানে নিয়ে যায়: https://api.drupal.org/api/drupal/core%21modules%21file%21src%21Entity%21File.php/class/File/8.2.x

আপনার আইডিইতে, আপনি \Drupal\file\Entity\Fileক্লাসটি অনুসন্ধান করতে পারেন । এটি সঠিক শ্রেণি তা ​​নিশ্চিত হওয়ার একটি উপায় টীকাটি দেখার জন্য:

@ContentEntityType(
  id = "file",
  label = @Translation("File"),
  handlers = {
    "storage" = "Drupal\file\FileStorage",
    "storage_schema" = "Drupal\file\FileStorageSchema",
    "access" = "Drupal\file\FileAccessControlHandler",
    "views_data" = "Drupal\file\FileViewsData",
  },
  base_table = "file_managed",
  entity_keys = {
    "id" = "fid",
    "label" = "filename",
    "langcode" = "langcode",
    "uuid" = "uuid"
  }
) 

লক্ষ্য করুন id- এটা হয় file। সম্ভবত, যদি ডিবাগ করা হয়, আপনি সামগ্রীর বিষয়বস্তুটি field_main_video->entityদেখতে পারেন এবং আপনি এই আইডিটি কোথাও দেখতে পাবেন। তারপরে আপনি কেবল এটির জন্য নিজের আইডিই অনুসন্ধান করুন। সাধারণত, যদিও সত্ত্বা টাইপগুলি সম্পর্কে সঠিকভাবে কেউ জানে যে কেউ সঠিক বর্গের দিকে তার অনুমান করার জন্য ব্যবহার করছে (যার পরে কেউ এন্টোটেশনে সঠিক আইডি রয়েছে কিনা তা যাচাই করতে পারে)।

এই বিশেষ ক্ষেত্রে, আমি আরও জানতে পারি যে Fileহয় সম্ভবত একটি বর্গ যে প্রসারিত করে ContentEntityBase, যেহেতু এটি আরো ডাটাবেসের বিষয়বস্তু (একটি কন্টেন্ট সত্তা) কনফিগারেশন চেয়ে (একটি কনফিগারেশন সত্তা) মত। সুতরাং যখন আমি দেখি আমার অনুমানগুলি নিশ্চিত হয়ে যায়, এটি আমাকে সঠিক ক্লাসটি খুঁজে পেয়েছে তা জানতে সহায়তা করে।

সুতরাং, সংক্ষেপে: আপনার আইডিই, কৌশলগত debug()বিবৃতি এবং কিছু অনুমান করা ড্রুপাল 8 আবিষ্কারের সেরা উপায়।

পিএস পরিবর্তন রেকর্ডগুলিও সহায়ক হতে পারে। এগুলি https://www.drupal.org/list-changes/drupal এ রয়েছে


আমি ওপি'র সমস্যাটি বিপরীত: কোন শ্রেণি প্রয়োগ করে / কোনটি উপলব্ধ করে তা কোন পাবলিক পদ্ধতিগুলি তা জেনে।
কিমলালুনো

হ্যাঁ, আমাকে এটি আবার পড়তে হবে, তবে আমি মনে করি না এটি আমি যা খুঁজছি। আমি কীভাবে ফাইফুলুড়ি () এমনকি প্রথম স্থানে বিদ্যমান তা জানার চেষ্টা করছি!
ববি

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

0

আপনি পিএইচপি get_class_methods ফাংশন ব্যবহার করতে পারেন। ব্যবহারকারীদের একটি ফাইল আপলোড নীচের উদাহরণ:

$image = $form_state->getValue('image_field_name_from_form');
$file = File::load( $image[0] );
$file->setPermanent();
$file->save();

$methods = [];
foreach (get_class_methods($file) as $method) {
        $methods[] = $method;
}
print_r($methods);

এটি আপনার $ পদ্ধতি অ্যারেতে অবজেক্ট $ ফাইলের জন্য উপলব্ধ সমস্ত পদ্ধতি যুক্ত করবে, যা আপনি মুদ্রণ করতে পারেন এবং তারপরে সমস্ত পদ্ধতি উপলব্ধ। এটি কেবলমাত্র দ্রুপাল নয়, পিএইচপি-তে কোনও বস্তুর জন্য বৈধ।

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