我发现使用Drupal 8的最大问题是我无法获取所需的数据。Drupal 8希望我使用公共方法,而不是通过对象手动向下钻取。问题是,我无法弄清楚获得可用方法列表的一致方法!(它们神奇地存在,我觉得我应该知道它们)。=
对于此示例,假设我有一个带有视频字段的内容类型。我需要在该字段中获取视频文件的原始URL。
因此,我将从节点ID($ nid)开始,以某种方式我必须弄清楚如何加载该节点。这还不错,因为有很多示例。所以我做类似的事情$node = \Drupal\node\Entity\Node::load($nid);
。
到目前为止,一切都很好。然后,我需要获取视频字段(field_main_video)的值。这使我永远都想不通,因为'net周围存在冲突的文档。最终我发现我必须做这样的事情(因为它是一个多值项):
$video = \Drupal\node\Entity\Node::load($nid)->field_main_video->getValue();
...然后遍历数组等。使用kint也不帮助我找到这个。因为例如,如果我kint($node)
查看方法下的内容,则不会在其中看到getValue()。仍然不可怕,因为周围有足够的示例可以弄清楚。
不过,当我深入研究时,我不知道(这是重要的部分)是,不是获取视频字段实体ID,而是加载实体,然后在实体中找到“ uri”字段,等等(例如我在D7中会:)有一种方法可以让我在同一行代码中全部获取URI!
$url = \Drupal\node\Entity\Node::load($nid)->field_main_video->entity->getFileUri();
但是我怎么可能知道这个getFileUri()存在呢? 我在博客文章中偶然发现了它。确实,这样做确实比在D7中更容易获得URI……但前提是您(神奇地)知道对象的每个“层”都有哪些方法。
最后,在这个示例中,我想问:如何以一种易于阅读和理解的方式为对象的每个级别找到所有公共方法? 注意,似乎应该有一种以drupal为中心的方式(即devel模块),而不是手动搜索api.drupal.org或使用特定于IDE的方式?