跳转到主要内容
半截烟头 提交于 20 September 2014

原文地址:https://www.drupal.org/node/1795854

[术语翻译] API:                     应用程序接口 Typed Data API: 类型化数据应用程序接口 Entity API:           实例化应用程序接口    

实例API如何实现类型化数据API

最后更新 2014年2月24日,Dixon创建于2012年9月26日

编辑:Berdir, izus, oenie, chx. 登录以编辑此页.

 

翻译:半截烟头

 

 

预览

在Drupal 8,实例应用程序接口基于类型化数据应用程序接口。

在此新的实例化应用程序接口中,任何东西都被视为基于此应用程序接口的一个字段,所以这些实例都是可预测的和一致的。

 

理解Drupal的数据模型

首先,在我们一头扎入类型化数据本身之前,我们必须先理解Drupal的数据模型(实例化应用程序接口)是如何被感知的。这很重要,因为这就是类型化数据应用程序接口所来自的地方,并且实例化应用程序接口也已被设计为系统的一个组成部分。

一个实例就是一个复杂的数据块 – 由其他数据块组成,就象一个由一列项目组成的字段集一样。一个字段项也一样复杂 – 它也是由更多块数据组成的,如文本值和它的输入格式。然而,到这些东西能够被描述为一些基本数据类型如字符串或整数的时候,这个复杂性也就至此为止。

一个来自Drupal 7的简化例子(这个例子无关语言,因为Drupal 8会用不同的方式来处理):

表一

<?php
//实例很复杂,他们包含其他数据块。
$entity;
//字段不复杂,它们仅包含一个列表项。
$entity->image;
//数据项很复杂,它们包含其他数据块,它们也是可翻译和可访问的(有权限)
$entity->image[0];
//文件编号是一个基本的整数
$entity->image[0][‘fid’];
//备选文本是一个基本的字符串
$entity->image[0][‘alt’];
?>

把它放到一起

下面是一个简化的例子,展示了实例化应用程序接口是如何用类型化数据应用程序接口实现不同的接口的。现实中,实例化应用程序接口扩展了这些接口,增加了一些实例化应用程序接口所需要的方法。仍然地,下面这些语句需要评估是否正确:

表二

 

<?php
// 实例是复杂的
$entity instanceof ComplexDataInterface;
// 属性不复杂,它们只是一个项目列表
$entity->get('image') instanceof ListInterface;
// 项目是复杂的
$entity->get('image')->offsetGet(0) instanceof ComplexDataInterface;
// 这个类型化的数据对象表示备选值
$entity->get('image')->offsetGet(0)->get('alt') instanceof TypedDataInterface;
// 备选值是一个基本的字符串
is_string($entity->get('image')->offsetGet(0)->get('alt')->getValue());
?>

 

 

下面简要概述了实例化应用程序接口如何扩展类型化数据应用程序接口来适应一些附加需求:

表三

<?php
interface EntityInterface extends ComplexDataInterface, TranslatableInterface, AccessibleInterface {
 // ...
}
interface FielditemListInterface extends ListInterface {
 // ...
}
// 注意这扩展了两个接口,解释如下。
interface FieldItemInterface extends ComplexDataInterface, TypedDataInterface {
 // ...
}
// 下面是实际实现方法
// 扩展一个抽象类加入一些常见逻辑
class ImageItem extends FieldItemBase {
 // ...
}
// 扩展一个抽象类加入一些常见逻辑
class String extends TypedData {
 // ...
}
?>

[下面两段需要更多的工作]

 

上面的两个最显着的事情是:

  1. EntityInterface为某些东西扩展一些功能接口如翻译或访问控制能力。这应该是能够很好地自解释的。
  2. FieldItemInterface 扩展ComplexDataInterface和TypedDataInterface两个接口。如早前所解释的,数据项看起来是复杂的,因为它们包含更多的数据块(如文本值和文本项目的格式)。但是同时一个数据项本身也是一个类型化数据块,因此它也有它自己的定义和数据类型。

 

因此,要总结上面这些,包括上面表二,下面这些语句请评估是否正确:

 

表四

<?php
$entity instanceof EntityInterface;
$entity->get('image') instanceof FieldItemListInterface;
$entity->get('image')->offsetGet(0) instanceof FieldItemInterface;
$entity->get('image')->offsetGet(0)->get('alt') instanceof String;
is_string($entity->get('image')->offsetGet(0)->get('alt')->getValue());
?>

 

使用应用程序接口

[本段需要更多例子]

实例化应用程序接口定义了一些魔幻的方法,如__get(),来允许快速简单地访问字段值。因此使用这个应用程序接口非常简单,而且它的语法也提示了许多Drupal 8以前时代的用法。

获取图象的备选文本的实际值将可以按如下方式来做:

表五

<?php
// 最啰嗦的方法
$string = $entity->get('image')->offsetGet(0)->get('alt')->getValue();
// 应用实例化应用程序接口所添加的魔术
$string = $entity->image[0]->alt;
// 应用更多的实例化应用程序接口所添加的魔术, 默认获取列表里的第一个数据项
$string = $entity->image->alt;
?>

上面的例子仅仅为旧的应用程序接口增加了一些漂亮语法。下面的例子示范了这个应用程序接口的真实值来自哪里 – 检查数据:

表六

<?php
// 根据”命名键”返回一个包含所有字段和它们的定义的数组。例如’image’字段。
$property_definitions = $entity->getFieldDefinitions();
// 根据”命名键”返回一个包含所有属性和它们的定义的数组。例如’file_id’和’alt’属性。
$property_definitions = $entity->image->getFieldDefinition()->getPropertyDefinitions();
// 只返回’alt’属性的定义
$string_definition = $entity->image->getFieldDefinition()->getPropertyDefinition('alt');
?>

基于上面我们所获取的定义,现在我们可以做一些聪明的事情,比如系列化或其他数据处理。我们也可以展现此语义丰富的数据,比如一个JSON-LD终端,然后其他系统就可以理解我们的数据的精要了。

查看https://drupal.org/node/2078241可看到更多关于对实体类型如何定义和使用字段定义。