मैं उपलब्ध सार्वजनिक तरीके कैसे खोजूं?


9

मुझे लग रहा है कि Drupal 8 के साथ काम करने में सबसे बड़ी समस्या यह है कि मुझे वह डेटा नहीं मिल सकता है जिसकी मुझे ज़रूरत है। Drupal 8 चाहता है कि मैं किसी ऑब्जेक्ट को मैन्युअल रूप से ड्रिलिंग करने के बजाय सार्वजनिक तरीकों का उपयोग करूं। समस्या यह है, मैं उपलब्ध तरीकों की सूची प्राप्त करने के लिए एक सुसंगत तरीके का पता नहीं लगा सकता! (वे जादुई रूप से मौजूद हैं, और मुझे लगता है कि मैं उनके बारे में जानने वाला हूं) =

इस उदाहरण के लिए, मान लें कि मेरे पास वीडियो फ़ील्ड के साथ एक सामग्री प्रकार है। मुझे उस फ़ील्ड में वीडियो फ़ाइल का कच्चा URL प्राप्त करने की आवश्यकता है।

इसलिए मैं एक नोड आईडी ($ nid) के साथ शुरू करूंगा, और किसी तरह मुझे यह पता लगाना होगा कि नोड कैसे लोड करना है। यह बहुत बुरा नहीं है क्योंकि इसके बहुत सारे उदाहरण हैं। इसलिए मैं कुछ ऐसा करता हूं $node = \Drupal\node\Entity\Node::load($nid);

अब तक सब ठीक है। फिर मुझे अपने वीडियो फ़ील्ड (फ़ील्ड_मैं_वीडियो) का मूल्य प्राप्त करने की आवश्यकता है। यह मुझे समझ में आया क्योंकि 'नेट के आसपास परस्पर विरोधी दस्तावेज हैं। अंत में मुझे लगा कि मुझे ऐसा कुछ करना होगा (क्योंकि यह एक बहुवचन आइटम है):

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

... तो सरणी के माध्यम से पाश आदि का उपयोग कर मुझे यह, या तो खोजने में मदद नहीं की। क्योंकि, उदाहरण के लिए, अगर मैं kint($node)और विधियों के तहत देखता हूं, तो मुझे वहाँ आइटम के रूप में getValue () नहीं दिखता है। अभी भी भयानक नहीं है, क्योंकि यह पता लगाने के लिए चारों ओर पर्याप्त उदाहरण थे।

जैसा कि मैंने गहराई से जाना, हालांकि, जो मुझे नहीं पता था (यह महत्वपूर्ण हिस्सा है) यह था कि वीडियो फ़ील्ड इकाई आईडी प्राप्त करने के बजाय, फिर इकाई को लोड करना, फिर इकाई में "उरी" फ़ील्ड ढूंढना, आदि (जैसे मैं D7 में होगा): एक तरीका था जो मुझे कोड के एक ही लाइन में URI प्राप्त करने देता है!

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

लेकिन मैं संभवतः इस getFileUri () का अस्तित्व कैसे जान सकता था? मैं एक ब्लॉग पोस्ट में इस पर ठोकर खाने के लिए हुआ। यह वास्तव में डी 7 की तुलना में एक यूआरआई प्राप्त करना आसान बनाता है ... लेकिन केवल अगर आप (जादुई) जानते हैं कि किसी वस्तु के प्रत्येक 'स्तर' के लिए क्या तरीके मौजूद हैं।

अंत में, इस उदाहरण के साथ मैं पूछ रहा हूं: आप किसी वस्तु के प्रत्येक स्तर के लिए सभी सार्वजनिक तरीके इस तरह से कैसे पा सकते हैं कि पढ़ना और समझना आसान है? ध्यान दें कि ऐसा लगता है कि मैन्युअल रूप से api.drupal.org खोजने या कुछ IDE विशिष्ट का उपयोग करने के बजाय ऐसा करने का एक ड्रुपल-केंद्रित (यानी। devel मॉड्यूल) तरीका होना चाहिए?


1
आधिकारिक दस्तावेज api.drupal.org पर है। एक बार जब आप उस ऑब्जेक्ट की कक्षा को समझ लेते हैं जिसे आप संभाल रहे हैं, तो आपको विरासत में प्राप्त होने वाले सभी तरीके मिलते हैं।
kiamlaluno

1
... लेकिन api.drupal.org पर सब कुछ देखने के बजाय, निश्चित रूप से php / devel में एक तरीका है स्क्रीन पर उपलब्ध तरीकों को डंप करने के लिए?
बॉबी

जवाबों:


14

सामग्री संस्थाओं में है कि वे अक्सर करते हैं सबसे अन्य बातों से अलग हैं नहीं कम से कम विन्यास क्षेत्रों के लिए नहीं, तरीके और उचित इंटरफेस है।

सामग्री संस्थाओं और क्षेत्रों के मामले में, सार्वजनिक तरीके वास्तव में वह नहीं हैं जो आप वास्तव में जानना चाहते हैं, आप जो चाहते हैं वह फ़ील्ड और गुणों के बारे में जानना चाहते हैं। और केवल जब आप एक संदर्भ के माध्यम से फिर से एक इकाई में आते हैं तो तरीके मायने रखते हैं।

अवलोकन के लिए, मैं हमेशा महान एंटिटी एपीआई चीट शीट का संदर्भ देता हूं ।

सामग्री संस्थाओं की एक निश्चित संरचना होती है, इकाई> क्षेत्र (FieldItemList)> FieldItem -> संपत्ति। एक संपत्ति या तो स्केलर है या किसी और चीज का संदर्भ है, जैसे कि एक अन्य इकाई, एक भाषा वस्तु, एक तिथि वस्तु, ...

कुछ निर्दिष्ट उदाहरणों के लिए, कुछ उपयोगी स्निपेट:

// 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
@Berdir, यह वास्तव में नाखून से टकराने वाले उदाहरणों की सूची है। मैं सिर्फ कुछ जानकारी, किसी भी जानकारी के लिए Google था और इसके करीब भी कुछ नहीं था। शानदार उत्तर, पुस्तक सामग्री।
मार्को ब्लाजाकोविक

4

यकीन नहीं है कि अगर यह पूरी तरह से आपके सवाल का जवाब देगा लेकिन क्या मुझे बहुत मदद करता है PhpStorm में आरेख सुविधा का उपयोग कर रहा है।

उदाहरण के लिए पदानुक्रम दिखाना यहाँ छवि विवरण दर्ज करें

आपके पास विधि नाम भी दिखाने के विकल्प हैं

यहाँ छवि विवरण दर्ज करें

मुझे उम्मीद है कि यह आपको एक तरह से मदद करेगा।


आप कमांड + क्लिक के साथ एक क्लास भी खोल सकते हैं, फिर क्लास संरचना (जहां आपका प्रोजेक्ट डायरेक्ट्री व्यू होगा) देखने के लिए यूएमएल को खोले बिना जल्दी से उसी जानकारी को स्कैन करने के लिए कमांड + क्लिक करें या स्ट्रक्चर टैब पर क्लिक करें।
केविन

मैं phpstorm का उपयोग नहीं करता, लेकिन भविष्य के संदर्भ के लिए यह जानना अच्छा है। मैं ऐसा करने के लिए एक तरीका खोज रहा हूं जिससे कि यह devel या कुछ ड्रुपल-केंद्रित का उपयोग कर सके। निश्चित रूप से कुछ में कहीं बनाया जाना चाहिए?
बॉबी

मुझे यह कहने के लिए खेद है, लेकिन मैं वास्तव में इस पल में नहीं सोचता कि आप इस आईडीई का उपयोग किए बिना एपीआई के साथ कुशलतापूर्वक छेड़छाड़ कर सकते हैं।
ओलेग विदेंव

NetBeans में कुछ PHP पदानुक्रम आरेख भी शामिल हैं। शायद इतना अच्छा नहीं है, लेकिन NetBeans मुफ्त सॉफ्टवेयर है (PHP तूफान बंद स्रोत और IMHO महंगा है) और आप इसे मुफ्त में डाउनलोड कर सकते हैं।
sanzante

उनके नमक के लायक कोई भी आईडीई ऐसा कर सकता है। BTW PHPStorm महंगा नहीं है यदि आप इसका उपयोग करते हैं जो इसे पेश करना है। आप मुफ्त ईएपी संस्करण का उपयोग कर सकते हैं, और यदि आप एक ओपन सोर्स प्रोजेक्ट (ड्रुपल मॉड्यूल या थीम) पर काम करते हैं, तो JetBrains आपको एक मुफ्त लाइसेंस देगा। हालांकि यहां चर्चा नहीं है।
केविन

4

खैर, मैंने अपने आप var_dump(get_class_methods($object))को दिए गए वर्ग के लिए उपलब्ध तरीकों की एक सूची रखने के लिए अक्सर संयोजन का उपयोग किया ।

मैं api.drupal.orgआगे के विवरणों के लिए भी अक्सर देखता हूं ।


2
ऐसा लगता है कि मैं अब तक जो देख रहा था उससे संबंधित सबसे अधिक बारीकी से जवाब। धन्यवाद!
बॉबी

0

आप पहले से ही बहुत करीब हैं।

सबसे पहले, आइए विधि की परिभाषा देखें : https://api.drupal.org/api/drupal/core%21modules%21file%21src%21Entity%21File.php/function/File%3A%3AgetFileUri/8.2.x.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को देख सकते हैं और आप कहीं न कहीं इस आईडी को देखेंगे। फिर आप अपने IDE में इसे खोजें। आमतौर पर, हालांकि, किसी को इकाई प्रकारों के बारे में पर्याप्त पता होता है कि कोई व्यक्ति सही वर्ग के लिए किसी के रास्ते का अनुमान लगाने के लिए उपयोग कर रहा है (जिसके बाद कोई यह सत्यापित कर सकता है कि एनोटेशन में सही आईडी है)।

इस विशेष मामले में, मुझे यह भी पता है कि Fileहै शायद एक वर्ग है कि फैली हुई है ContentEntityBase, क्योंकि यह अधिक डेटाबेस सामग्री (यदि किसी सामग्री इकाई) विन्यास से (एक विन्यास इकाई) की तरह है। इसलिए जब मैं अपनी मान्यताओं की पुष्टि करता हूं, तो मुझे यह जानने में मदद मिलती है कि मैंने सही वर्ग पाया है।

तो, संक्षेप में: आपका आईडीई, रणनीतिक debug()वक्तव्य और कुछ अनुमान कार्य Drupal 8 की खोज के लिए सबसे अच्छे तरीके हैं।

PS चेंज रिकॉर्ड भी मददगार हो सकते हैं। वे https://www.drupal.org/list-changes/drupal पर हैं


मैं ओपी की समस्या को उल्टा मानता हूं: यह जानते हुए कि कौन से सार्वजनिक तरीके एक कक्षा में लागू होते हैं / उपलब्ध हैं।
kiamlaluno

हाँ, मुझे इसे फिर से पढ़ना पड़ सकता है, लेकिन मुझे नहीं लगता कि यह मैं देख रहा हूँ। मैं यह पता लगाने की कोशिश कर रहा हूं कि getFileUri () यहां तक ​​कि पहली जगह में कैसे मौजूद है!
बॉबी

@ बॉबी एक फ़ाइल एक इकाई प्रकार है, इसलिए आप बस इसके स्रोत को देखें , जहाँ आपको वह विधि मिल जाएगी जो आप सूचीबद्ध होने के बाद और पूरी तरह से प्रलेखित है। क्या यह सिर्फ इतना है कि आपको पता नहीं था कि एक फ़ाइल एक इकाई प्रकार है? या कि आप कोड में एक इकाई प्रकार का पता लगाने के लिए सम्मेलन नहीं जानते हैं? या कुछ और आगे श्रृंखला? D8 में सब कुछ के लिए अमूर्त की कई परतें हैं, यह सिम्फोनी रास्ता नहीं है, इसलिए "आधार" ज्ञान का एक बहुत आप की जरूरत है पहले कोड में delving से पहले
क्लाइव

0

आप PHP 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);

यह आपके $ तरीकों के सरणी में ऑब्जेक्ट $ फ़ाइल में उपलब्ध सभी तरीकों को जोड़ देगा, जिसे आप प्रिंट कर सकते हैं और फिर उपलब्ध सभी तरीकों को देख सकते हैं। यह PHP में किसी भी ऑब्जेक्ट के लिए मान्य है, न कि केवल Drupal पर।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.