数据库 API 在发生错误时会抛出异常,可以通过在 try {} catch() {} 块中包装数据库操作来捕获,如下面示例所示:
// 在这里开启事务。
$txn = $connection->startTransaction();
try {
$id = $connection->insert('example')
->fields([
'field1' => 'mystring',
'field2' => 5,
])
->execute();
my_other_function($id);
return $id;
}
catch (Exception $e) {
// 某处发生错误,因此立即回滚。
$txn->rollBack();
// 将异常记录到 watchdog。
\Drupal::logger('type')->error($e->getMessage());
}
Drupal 的数据库层并不提供跨数据库的 SQL 函数抽象。为了在不同受支持的数据库引擎之间保持可移植性,你的代码应当仅使用那些已知属于 ANSI 标准并且在 Drupal 支持的所有数据库中都可用的函数。下面列出的只是一个仍然不完整的清单。推荐使用此处给出的形式,因为其他语法变体可能并不适用于所有数据库。
请注意,数据库层并没有白名单操作符,因此你可以传递一个非标准函数,比如 REPLACE(),在支持这种语法的数据库中它将可以正常工作。
逻辑运算符
- AND
- OR
- NOT
比较运算符
- <
- >
- <=
- >=
- <>
- LIKE
Drupal 8 实体系统
实体是带有方法的强类型类
| 通用方法 |
$entity->id() |
| 特定于实体类型的方法 | $node->getTitle() |
背景
实体系统在 Drupal 7 开发周期的后期引入,带有基本的实体加载标准。entity.module 进一步扩展了 API,增加了对保存和删除实体的支持,以及许多其他改进。
这些改进中的大多数现在已包含在 Drupal 8 中。实体验证现在在其自己的 API 中进行(例如,它可以验证通过 REST 保存的实体,而不是通过表单)。
两种变体
核心中的实体类型有两种变体。
- Drupal 7 - 实体是通用的 stdClass 对象。
- Drupal 8 - 实体现在是具有特定类型的对象,每种实体类型都会定义一个类,用于该实体的实例。
要求
实体类必须放置在提供该实体类型的模块的 Entity 子命名空间中,例如 \Drupal\[module_name]\Entity。这意味着实体类的 PHP 文件可以在模块的 src/Entity 目录下找到。
类的文档块必须包含 EntityType 注解,它定义了该类型实体的元数据。这些包括实体类型的标签、控制器、表等。有关所有可用元数据属性的文档化列表,请参阅 \Drupal\Core\Entity\Annotation\EntityType 类。
命名
如果实体类型与模块名称不一致,则实体类型的名称必须带有模块名前缀。实体类型类本身不需要加前缀,因为它位于定义模块的命名空间中,只要类名本身足够清晰。例如,分类术语的实体类型称为 taxonomy_term,而类名为 Drupal\taxonomy\Entity\Term。
涵盖了通用实体的 API 方法
- Entity::create()
- Entity::load()
- Entity::save()
- Entity::id()
- Entity::bundle()
- Entity::isNew()
- Entity::label()
更具体的 API 将在专门章节中介绍。
在 Drupal 8 中,捆绑(Bundles)是一种信息容器类型,用于保存字段定义或设置。有时它们也被称为“子类型(subtypes)”。捆绑是可选的,在信息容器的层级中位于实体类型之下。
- 实体变体(内容和配置;许多实体成对出现,例如区块)
- 实体类型
- 捆绑或子类型(可选)
这些容器类型的示例:
配置对象使用 Entity API 将配置信息保存到数据库中。
与内容实体的区别
- 与 CMI API 集成以支持导出
- 没有字段
- 使用模式文件(内容实体使用 hook_schema())
教程
- Drupal 示例:在 Drupal 8 中创建配置实体类型
- 修改记录:https://www.drupal.org/node/1818734
本速查表包含了内容实体中常用的方法、类和接口的概览。
![]()
/sites/default/files/drupal-content-entity-8.0.pdf
内容实体继承了许多来自通用实体的行为。请参见 使用 Entity API 来了解这些通用功能。
目标受众
本文件主要面向具有面向对象 PHP、Drupal 6 或 Drupal 7 编程经验的开发人员,以及希望学习 Drupal 8 原理的人。
Drupal 8 内容实体类型创建文档 包含完整的可用选项列表。
在 Drupal 8 中构建无绑定的内容类型
在这种情况下,我们创建一个 Drupal 8 内容对象,它没有任何绑定。
该实体没有实现字段 API,因此它仅存在于代码中。不过,这可以作为构建内容实体的有用框架,因为我们稍后会导入更复杂的数据。
最后,当涉及到一些面向对象编程(OOP)的概念时,我会引用相关文档。
背景
我们的模块叫做“advertiser”。
我们的内容实体类型也叫做“advertiser”。
我们新的 Drupal 8 advertiser 内容实体将拥有以下字段:
- UUID
- ID
Эта страница является копией конфигурации «Включить по умолчанию» в модуле Drupal 8. Это следует рассматривать как已弃用。
在 Drupal 8 中,借助新的配置 API,创建自定义内容类型变得相当简单。
前提条件
- 已安装 Drupal 8.0.x
- 有一个自定义模块(在本示例中使用的模块名为 foobar)
创建自定义内容类型
如介绍中所述,创建自定义内容类型是通过创建几个 YAML 文件完成的,这些文件包含所有必需的设置。在此示例中,我们将创建一个名为 Car Brand 的内容类型,它将包含两个字段(默认):正文和标题。
foobar/config/install/node.type.car_brand.yml