Я обнаружил, что самая большая проблема в работе с Drupal 8 - я не могу получить нужные мне данные. Drupal 8 хочет, чтобы я использовал публичные методы, а не сверлял вручную объект. Проблема в том, что я не могу найти последовательный способ получения списка доступных методов! (они волшебным образом существуют, и я чувствую, что должен знать о них).
Для этого примера, скажем, у меня есть тип контента с полем видео. Мне нужно получить необработанный URL-адрес видеофайла в этом поле.
Поэтому я бы начал с идентификатора узла ($ nid), и каким-то образом я должен выяснить, как загрузить узел. Это не так уж плохо, потому что есть много примеров. Так что я делаю что-то вроде $node = \Drupal\node\Entity\Node::load($nid);
.
Все идет нормально. Затем мне нужно получить значение моего видео поля (field_main_video). Я НАВСЕГДА понял, потому что в сети есть противоречивая документация. Наконец, я понял, что мне нужно сделать что-то вроде этого (потому что это многозначный элемент):
$video = \Drupal\node\Entity\Node::load($nid)->field_main_video->getValue();
... затем цикл по массиву и т. д. Использование kint также не помогло мне найти это. Потому что, например, если я kint($node)
и смотрю под методами, я не вижу getValue () как элемент там. Все еще не ужасно, потому что было достаточно примеров, чтобы понять это.
Однако когда я углубляюсь, то, чего я не знал (это важная часть), было то, что вместо того, чтобы получать идентификатор сущности поля видео, затем загружать сущность, затем находить поле «uri» в сущности и т. Д. (Например, Я бы в D7): был метод, который позволяет мне получить URI все в той же строке кода!
$url = \Drupal\node\Entity\Node::load($nid)->field_main_video->entity->getFileUri();
Но как я мог знать, что этот getFileUri () существует? Я случайно наткнулся на это в сообщении в блоге. Это действительно делает получение URI легче, чем в D7 ... но только если вы знаете (волшебным образом), какие методы существуют для каждого «уровня» объекта.
В конце этого примера я спрашиваю: как найти все общедоступные методы для каждого уровня объекта так, чтобы их было легко читать и понимать? Заметьте, что, похоже, должен быть друпалцентричный (т.е. модуль devel) способ сделать это, а не искать вручную api.drupal.org или использовать что-то специфичное для IDE?
Ответы:
Контентные сущности отличаются от большинства других тем, что они часто не имеют методов и надлежащих интерфейсов, по крайней мере, для настраиваемых полей.
В случае сущностей и полей контента публичные методы - это не совсем то, что вы на самом деле хотите знать, а то, что вы хотите знать о полях и свойствах. И только когда вы снова обращаетесь к сущности через ссылку, методы имеют значение.
Для обзора, я всегда обращаюсь к великому Шпаргалке Entity API .
Объекты содержимого имеют фиксированную структуру: Entity> Field (FieldItemList)> FieldItem -> Property. Свойство является либо скалярным, либо ссылкой на что-то другое, например, на другую сущность, объект языка, объект даты, ...
Для нескольких указанных примеров, несколько полезных фрагментов:
источник
Не уверен, что это полностью ответит на ваш вопрос, но мне очень помогает использование диаграмм в PhpStorm.
Например, показывая иерархию
У вас есть варианты, чтобы показать также имена методов
Я надеюсь, что это поможет вам.
источник
Ну, я часто использовал комбинацию,
var_dump(get_class_methods($object))
чтобы получить список доступных методов для данного класса.Я также часто заглядываю в
api.drupal.org
подробности.источник
Ты уже очень близко.
Во-первых, давайте посмотрим на определение метода: https://api.drupal.org/api/drupal/core%21modules%21file%21src%21Entity%21File.php/function/File%3A%3AgetFileUri/8.2.x
Отсюда мы можем увидеть класс, частью которого он является, и на него есть ссылка:
Нажатие приводит нас к: https://api.drupal.org/api/drupal/core%21modules%21file%21src%21Entity%21File.php/class/File/8.2.x
В вашей IDE вы также можете искать
\Drupal\file\Entity\File
класс. Один из способов убедиться, что это правильный класс, - взглянуть на аннотацию:Обратите внимание
id
- это такfile
. Предположительно, при отладке вы можете посмотреть содержимоеfield_main_video->entity
и где-нибудь увидеть этот идентификатор. Тогда вы просто ищете его в вашей IDE. Обычно, однако, достаточно известно о типах сущностей, которые он использует, чтобы угадать свой путь к нужному классу (после чего можно проверить, что аннотация содержит правильный идентификатор).В этом конкретном случае я также знаю, что
File
это, вероятно, класс, который расширяетсяContentEntityBase
, поскольку он больше похож на контент базы данных (сущность контента), чем на конфигурацию (сущность конфигурации). Поэтому, когда я вижу, что мои предположения подтверждаются, это помогает мне узнать, что я нашел правильный класс.Итак, вкратце: ваша IDE, стратегические
debug()
заявления и некоторые догадки - лучшие способы открыть Drupal 8.PS Изменение записей также может быть полезным. Они находятся по адресу https://www.drupal.org/list-changes/drupal
источник
Вы можете использовать функцию PHP get_class_methods. В приведенном ниже примере пользователи загружают файл:
Это добавит все методы, доступные для объекта $ file, в ваш массив $ Methods, который вы можете распечатать, а затем увидеть все доступные методы. Это действительно для любых объектов в PHP, не только для Drupal.
источник