2. 的核心概念 CubicWeb

本节定义了 CubicWeb 框架。为了在阅读本书时避免混淆,请花些时间阅读以下定义,并在阅读过程中使用本节作为参考。

2.1. 立方体

立方体是由三部分组成的软件组件:

  • ITS数据模型 (schema

  • 它的逻辑 (entities

  • 其用户界面 (views

多维数据集可以使用其他多维数据集作为构建基块,并将它们组合起来,以提供比其部分更丰富的功能。立方体 cubicweb-blogcubicweb-comment 可用于生成名为 我的博客 有可评论的博客条目。

这个 CubicWeb.org Forge 提供大量由社区开发的立方体,并在免费软件许可证下提供。

注解

命令 cubicweb-ctl list 显示可用多维数据集的列表。

2.2. 实例

实例是安装在计算机上并基于一个或多个多维数据集的可运行应用程序。

实例目录包含配置文件。可以基于同一个多维数据集创建多个实例。例如,可以在一个计算机系统上基于 cubicweb-forge 立方体。

命令 cubicweb-ctl list 还显示安装在系统上的实例列表。

注解

术语“应用程序”是指“应该做一些事情作为一个整体”,例如更像一个项目,因此可以根据上下文引用实例或多维数据集。这本书会尽量用 应用cube实例 适当时。

2.3. 数据存储库

数据存储库 1 封装和分组对一个或多个数据源(包括SQL数据库、LDAP存储库、其他 CubicWeb 实例存储库、文件系统、Google Appengine的数据存储等)。

All interactions with the repository are done using the Relation Query Language (RQL语法). The repository federates the data sources and hides them from the querier, which does not realize when a query spans several data sources and requires running sub-queries and merges to complete.

应用程序逻辑可以映射到存储库中发生的数据事件,如创建实体、删除关系等。例如,当对象状态更改时,它用于发送电子邮件通知。参见 挂钩和操作 下面。

1

不要与Mercurial存储库或Debian存储库混淆。

2.4. Web引擎

Web引擎响应HTTP请求并运行用户界面。

默认情况下,Web引擎提供 CRUD 基于实例数据模型的用户界面。可以创建、显示、更新和删除实体。由于默认的用户界面不是很花哨,所以通常需要开发自己的界面。

2.5. 模式(数据模型)

多维数据集的数据模型被描述为使用从 yams 类库。

entity type 定义属性序列。属性可以是以下类型: StringIntFloatBooleanDateTimeDatetimeIntervalPasswordBytesRichString .

A relation type 用于定义实体类型之间的定向二进制关系。关系的左侧部分命名为 subject 右边的部分被命名为 object .

A relation definition 是三重的( 主题实体类型关系类型对象实体类型 )与一组属性(如基数、约束等)关联。

可以对实体类型或关系定义设置权限,以控制谁将能够创建、读取、更新或删除实体和关系。权限授予组(用户可能属于组)或使用RQL表达式(如果RQL表达式返回某些结果,则授予权限)。

将系统所需的一些元数据添加到数据模型中。其中包括用户和组等实体、用于存储数据模型本身的实体以及唯一标识符、创建日期、创建者等属性。

当你创建一个新的 CubicWeb 实例中,架构存储在数据库中。当实例基于Evolve的多维数据集时,它们可能会更改其数据模型并提供迁移脚本,当管理员为实例运行升级过程时,这些脚本将被执行。

2.6. 注册表和应用程序对象

2.6.1. 应用程序对象

除了一些核心功能外,框架的几乎所有功能都是由动态对象实现的。 (application objectsappobjects )存储在两级注册表中。每个对象都会影响到此注册表中具有标识符的注册表。在同一注册表中,可以有多个对象共享标识符:

对象的 __registry__ : object's `_ _里贾德 [应用程序对象列表]

也就是说, registry 包含多个(子)注册表,其中包含与标识符关联的AppObjects列表。

AppObjects的基类是 cubicweb.appobject.AppObject .

2.6.2. 选择器

在运行时,可以根据一些上下文信息在注册表中选择AppObjects。选择是通过比较 分数 由每个AppObject的 选择器 .

对象越适合上下文,分数越高。分数是将AppObjects连接到数据模型的粘合剂。适当地使用它们是构建行为良好的立方体的重要部分。

CubicWeb 提供一组可以参数化的基本选择器。此外,选择器还可以与 ~ 一元运算符(负数)和二元运算符 &| (分别是“和”和“或”)来构建更复杂的选择器。当然,复杂的选择器也可以组合在一起。最后,您可以编写自己的选择器。

2.6.3. 这个 registry

启动时, registry 检查多个目录以查找兼容的类定义。在记录过程之后,对象被分配到注册表,并通过选择过程变得可用。

在多维数据集中,应用程序对象类在以下模块或包中查找:

  • entities

  • views

  • hooks

  • sobjects

从注册表中查找某些应用程序对象有三种常见方法:

  • 通过指定标识符和上下文对象来获取最合适的对象。选择得分最高的对象。对于特定的上下文,应该总是有一个比其他对象得分更高的AppObject。

  • 通过指定注册表获取应用于上下文的所有对象。将返回一个对象列表,其中包含该注册表中每个标识符得分最高(>0)的对象。

  • 获取特定注册表/标识符中的对象。不涉及选择过程:注册表将在该单元格中找到单个对象。

2.7. RQL查询语言

当您拥有强大的数据操作语言时,不需要复杂的ORM。

中的所有持久数据 CubicWeb 使用rql检索和修改实例(请参见 介绍

这种查询语言受到SQL的启发,但为了强调浏览关系,它处于更高的层次。

2.7.1. 结果集

向数据存储库发出的每个请求(使用rql)都返回一个我们称之为结果集的对象。它可以方便地使用检索到的数据,在后端的本机数据类型和 CubicWeb 架构的EntityTypes。

结果集提供对原始数据的访问,以一种简单的方式生成基本的python数据类型或模式定义的高级实体。

2.8. 意见

CubicWeb是数据驱动的

视图系统通过上述选择系统与数据松散耦合。视图是具有专用接口的应用程序对象,用于“渲染”某些内容,例如生成一些可以显示给用户的HTML、文本、XML、PDF或其他内容。

视图实际上被划分为不同类型的对象,例如 templatesboxescomponents 和适当的 views 更高级的抽象对于以面向对象的方式构建用户界面非常有用。

2.9. 挂钩和操作

CubicWeb提供了一个可扩展的数据存储库

使用yams类型定义的数据模型允许以一种舒适的方式表示数据模型。然而,数据模型的几个方面不能在那里表示出来。例如:

  • 管理计算属性

  • 执行复杂的业务规则

  • 与数据事件相关的实际副作用(电子邮件通知是一个主要示例)

钩子系统与SQL数据库引擎的触发器非常相似,除了:

  • 它不局限于一个特定的SQL后端(每个后端都有一种对触发器进行编码的惯用方式),也不局限于SQL后端(想想LDAP或Mercurial存储库)

  • 它与框架的其余部分很好地耦合。

钩子也是应用程序对象(在 hooks 注册表),并在事件上选择,如在实体/关系上添加/更新/删除之后/之前、服务器启动或关闭等。

Operations 可以通过钩子进行实例化,以在事务的提交/回滚的不同步骤中进行进一步的处理,这通常在钩子执行时无法安全地完成。

钩子和操作是任何中等复杂的CubicWeb应用程序的基本组成部分。

注解

在钩子和操作中执行的RQL查询是 不安全的 默认情况下,即读写安全性将被停用,除非明确要求。