原文地址:http://www.istos.it/comment/2870
使用entity来作为内容的抽象是Drupal7架构层面上最大的改变之一。在这一系列的博客文章中我将介绍entity概念是如何产生的,它到底是什么还有如何能被应用在模块中。第一篇文章将介绍Drupal7中的entity。
Drupal7 在各个层面有许多大的改变。这其中,使用entity作为内容主要的抽象是底层架构的最大改变之一。
Drupal7的changelog中没有提到entity就是一个明显的标志,说明entity被深层嵌入了,entity并不是一个面向用户的工具或者一个抽象概念,而是在架构级别上处理内容的工具。
我本打算只写一片文章来帮助自己来理清对entity的理解并帮助到其他人,但是后来发现一篇文章根本不够!所以我写了一个系列文章。我首相将回顾一下历史来看看entity是如何产生的,然后解释一下entity到底是什么,最后来讲讲如何来使用entity来让一个模块变的更好。
所以首先我们来试着了解entity是如何发展到现在的。
最初,这里是nodes
在Drupal6中,nodes作为内容主要的单位与其他的内容与相关节点,可以被认为是Drupal的基本抽象概念。
已经有很多文章来描述这个工具的强大。你给nodes添加了一些功能,你网站上的所有内容都立即获得那些功能。只要你为nodes写了扩展功能,比如版本,投票,演示,你可以确定的是在所有情形下都是可用的。
通过Flexinode模块以及后来的Content Construction Kit模块,我们可以添加fields到nodes上。这样在很大程度上将Drupal的灵活性带到了一个全新的高度。因此给nodes添加fields的能力就变成了Drupal7的主要目标。
让我们把所有东西都变成node!
在同一时间,Drupal6的第三方模块space证明了人们需要给更多的东西添加fields而不仅仅是nodes。你可以使用模块将用户档案转换成nodes,为的就是通过CCK模块给用户档案添加fields。你也可以通过模块将评论转换为nodes,也是为了给评论添加fields,甚至用模块将taxonomy转换成nodes。
事实上,“将所有东西都变成node”这个说话已经有很长的一段历史了。一条Google搜索显示,早在2006年5月Robert Douglass就建议“Drupal中的任何东西都可以做成node”并描述了那样做潜在的好处。
这样的想法在其他很多场合也出现过,并且我真的认为那可以被认为是entity的起源。
让我们来介绍一种新的概念
所以,一方面有很多人在争论将所有东西做成node的好处是可以通过CCK模块为其添加field。另一方面,将CCK加入到Drupal7核心中需要付出巨大的努力。
使用Drupal第三方模块space来作为一个实验来看看什么应该在新版本的Drupal中发生是一个很好的示范,以及在Drupal7核心开发人员在field上做出的非常令人惊讶的工作后,这两种想法得到了满足。
“将所有东西变成node”这个概念在Drupal7中变成了“将所有东西变成entity”,并且node就是entity中的一个类型。并且用户,taxonomy和评论等都是entity。Entity可以使用Field API为其添加field。
尽管如此,准确的架构解决方案并不是这样简单的一步。首先要使其可以被添加field(就像 nodes 一样),然后引入entity来整合在不同地方出现的重复代码和标准化术语来简化所需的功能来处理诸如taxonomy,用户评论和nodes。
如果你仔细查找过Drupal issue queue,你会发现一个重要的issue“Standarized, pluggable entity loading (nodes, users, taxonomy, files, comments)”- 这篇文章中Frando举例说明了如果处理“loadable things,可以选择性的拥有添加field的能力”
另外一个有趣的讨论是“Use the term entity instead of object”,在这个issue中,大家讨论了entities的准确定义,并且“ 这个补丁”显示了就在几个月之前,Drupal中的代码也没有连贯的使用准确的术语(Entities被描述为objects)- 但是Chx和yched为修复这些问题作出了很多努力。
对Entities说Hi
现在,Drupal7发布才几个月了,Entities是新的nodes。
如果你想在处理内容上使用一些新方法并且充分利用Drupal的力量,你不需要去写一个模块将 “某些东西”转化为node,而是创建你自己的entity(Awesome Relationships 模块是个很好的例子)。
这也意味着你现在可以想象一个没有nodes的Drupal,因为允许你这样做的工具已经在那里了。Nodes只是entity的一种类型。当然,你可以想象在代码的层面来完成他仍然不是那么简单,因为还有一些复杂的东西。但是已经迈出了重要的第一步。
接下来我们将看看entities到底是什么并且探索如何在模块中使用它们。
请继续阅读第二篇译文:Drupal Entities - 第二部分 - The what, where and when of Entities (龙马备注)