Uważam, że największym problemem w pracy z Drupalem 8 jest to, że nie mogę uzyskać potrzebnych danych. Drupal 8 chce, żebym używał publicznych metod zamiast ręcznego drążenia obiektu. Problem polega na tym, że nie mogę znaleźć spójnego sposobu na uzyskanie listy dostępnych metod! (istnieją magicznie i wydaje mi się, że powinienem o nich wiedzieć)
W tym przykładzie załóżmy, że mam typ zawartości z polem wideo. Muszę uzyskać nieprzetworzony adres URL pliku wideo w tym polu.
Zacznę więc od identyfikatora węzła ($ nid) i jakoś muszę wymyślić, jak załadować węzeł. Nie jest tak źle, ponieważ jest wiele przykładów. Więc robię coś takiego $node = \Drupal\node\Entity\Node::load($nid);
.
Na razie w porządku. Następnie muszę uzyskać wartość mojego pola wideo (field_main_video). Zajęło mi to ZAWSZE rozszyfrowanie, ponieważ wokół sieci istnieje sprzeczna dokumentacja. W końcu pomyślałem, że muszę zrobić coś takiego (ponieważ jest to element wielowartościowy):
$video = \Drupal\node\Entity\Node::load($nid)->field_main_video->getValue();
... a potem zapętlić tablicę itp. Użycie kinta również mi nie pomogło. Ponieważ na przykład, jeśli szukam kint($node)
metod, nie widzę w tym getValue () elementu. Nadal nie jest straszny, ponieważ było wystarczająco dużo przykładów, aby to rozgryźć.
Kiedy jednak wchodziłem głębiej, nie wiedziałem (to jest ważna część), że zamiast uzyskać identyfikator encji pola wideo, a następnie załadować encję, a następnie znaleźć pole „uri” w encji itp. (Np. Chciałbym w D7): Była metoda, która pozwala mi uzyskać URI wszystko w tym samym wierszu kodu!
$url = \Drupal\node\Entity\Node::load($nid)->field_main_video->entity->getFileUri();
Ale skąd mogłem wiedzieć, że istnieje metoda getFileUri ()? Zdarzyło mi się natknąć na to w poście na blogu. To naprawdę sprawia, że uzyskanie URI jest łatwiejsze niż w D7 ... ale tylko wtedy, gdy wiesz (magicznie), jakie metody istnieją dla każdego 'poziomu' obiektu.
Na koniec w tym przykładzie pytam: Jak znaleźć wszystkie publiczne metody dla każdego poziomu obiektu w sposób łatwy do odczytania i zrozumienia? Zauważ, że wydaje się, że powinien istnieć sposób na drupal-centryczny (tj. Moduł programistyczny), zamiast ręcznego przeszukiwania api.drupal.org lub używania czegoś specyficznego dla IDE?
Odpowiedzi:
Podmioty treści różnią się od większości innych tym, że często nie mają metod i odpowiednich interfejsów, przynajmniej nie dla pól konfigurowalnych.
W przypadku encji treści i pól metody publiczne nie są tak naprawdę tym, co naprawdę chcesz wiedzieć, a tym, czego chcesz, to wiedzieć o polach i właściwościach. I tylko wtedy, gdy ponownie dojdziesz do bytu poprzez referencję, metody mają znaczenie.
Dla ogólnego przeglądu zawsze odwołuję się do wspaniałego ściągu interfejsu API Entity API .
Elementy treści mają stałą strukturę, Entity> Field (FieldItemList)> FieldItem -> Właściwość. Właściwość jest skalarna lub odnosi się do czegoś innego, np. Innej encji, obiektu językowego, obiektu daty ...
W kilku określonych przykładach kilka użytecznych fragmentów:
źródło
Nie jestem pewien, czy to całkowicie odpowie na twoje pytanie, ale bardzo pomaga mi korzystanie z funkcji diagramów w PhpStorm.
Na przykład pokazując hierarchię
Masz opcje, aby wyświetlić także nazwy metod
Mam nadzieję, że ci to pomoże.
źródło
Cóż, dość często używałem kombinacji,
var_dump(get_class_methods($object))
aby mieć listę dostępnych metod dla danej klasy.Często szukam też
api.drupal.org
dalszych szczegółów.źródło
Jesteś już bardzo blisko.
Najpierw spójrzmy na definicję metody: https://api.drupal.org/api/drupal/core%21modules%21file%21src%21Entity%21File.php/function/File%3A%3AgetFileUri/8.2.x
Stąd możemy zobaczyć klasę, której jest częścią, i jest do niej link:
Kliknięcie powoduje przejście do: https://api.drupal.org/api/drupal/core%21modules%21file%21src%21Entity%21File.php/class/File/8.2.x
W swoim IDE możesz także wyszukać
\Drupal\file\Entity\File
klasę. Jednym ze sposobów, aby upewnić się, że jest to poprawna klasa, jest spojrzenie na adnotację:Zauważ
id
- jestfile
. Przypuszczalnie, jeśli debugujesz, możesz spojrzeć na zawartośćfield_main_video->entity
i zobaczysz gdzieś ten identyfikator. Następnie po prostu wyszukaj go w swoim IDE. Zazwyczaj jednak wie się wystarczająco dużo o typach jednostek, których się używa, aby odgadnąć drogę do właściwej klasy (po czym można sprawdzić, czy adnotacja zawiera poprawny identyfikator).W tym konkretnym przypadku wiem też, że prawdopodobnie
File
jest to klasa, która się rozszerza , ponieważ bardziej przypomina ona zawartość bazy danych (encja treści) niż konfigurację (encja konfiguracji). Więc kiedy widzę, że moje założenia się potwierdzają, to pomaga mi wiedzieć, że znalazłem właściwą klasę.ContentEntityBase
Krótko mówiąc: twoje IDE, strategiczne
debug()
deklaracje i pewne domysły to najlepsze sposoby na odkrycie Drupala 8.Pomocne mogą być również rekordy PS Change. Są na https://www.drupal.org/list-changes/drupal
źródło
Możesz użyć funkcji get_class_methods w PHP. Poniższy przykład przedstawia przesyłanie plików:
Spowoduje to dodanie wszystkich metod dostępnych do pliku obiektowego $ do tablicy $ metod, którą można wydrukować, a następnie zobaczyć wszystkie dostępne metody. Dotyczy to dowolnych obiektów w PHP, nie tylko Drupala.
źródło