Skip to main content

Placeholders

现在推荐使用 Expressions 表达式

Placeholders 占位符允许开发者在编排中使用特殊标记来访问和处理数据。占位符主要有两种方式:注入 ${...} 和 transform @{...}

例如在构件属性中使用注入占位符:

brick: instance-list
properties:
q: "${QUERY.q}"
url: "/some-url?p=${QUERY.page|number}"

或者在 Resolve 中使用 transform:

context:
- name: myAsyncContext
resolve:
useProvider: my-provider
transform:
value: "@{hostname}"

注入

示例说明
${xyz}路由 path 匹配的参数
${QUERY.abc}URL query 参数
${QUERY.*}URLSearchParams 对象。结合 ${QUERY.*|string} 可以获得序列化的参数如:a=1&b=2
${xyz=good}如果没有找到参数 xyz,那么设置一个默认值 "good",默认值仅使用 string
${xyz|number}对参数做类型转换(或称为管道),未设置时将不做转换,参见 Pipes 管道
${QUERY.asc=0|boolean}同时设置默认值和类型转换
/some-url?q=${QUERY.q}可以在普通字符串中混合占位符,此时返回的整体数据始终为字符串,而单个完整的占位符会返回原始对象,例如 ${QUERY.*} 将返回 URLSearchParams 对象

除了上述示例外,还支持注入一些 Expressions 表达式中支持的内置对象,主要包括:QUERYQUERY_ARRAYHASHANCHORAPPEVENTSYSFLAGS

Transform

Transform 和注入占位符基本类似,不同的是,它接收的数据为特定场景下提供的数据。

例如在 Resolve 中,接收的数据是 Provider 构件返回的数据;而在 useBrick 的属性配置中,接收的数据是其所属构件为 useBrick 传递的 data 属性。

详细说明

例如以下 transform 配置片段(yaml):

transform:
url: '?query=@{ some.field[0].path = ["complex","value"] | map : instanceId | slice : 0 : 10 }'

字段 url 中被 @{ ... } 包裹的部分就是占位符,它们将在运行时根据上下文信息计算得到。

以上 url 可以被分解为以下结构:

- RawString: "?query="
- Placeholder:
field: "some.field[0].path"
default:
value: ["complex", "value"]
pipes:
- identifier: map
parameters:
- "instanceId"
- identifier: slice
parameters:
- 0
- 10

在运行时,Placeholder 将根据上下文按以下流程计算得到结果:

  1. 使用 _.get(context, field) 得到 result
  2. 如果 resultundefined,那么将 default.value 赋值给 result
  3. 遍历 pipes,通过 identifier 找到对应的管道函数 pipe,将 result 作为第一个参数,parameters 作为额外参数列表,调用 pipe 并将返回值赋值给 result
  4. 返回 result

请参考 Pipes 管道

而最终 url 得到的值为所有 RawStringPlaceholder 计算得到的值通过 Array#join 拼接后的结果。

注意:Array#join 如果遇到 undefined, null 或空数组 [] 的元素,将被转换为空字符串。

注意:当某个字段仅由单个 Placeholder 组成时,将返回它原始计算得到的值,而不是 Array#join 的结果。

default 默认值及 pipe parameters 管道参数语法中,可以使用 JSON value 的格式传递各种形式的值。同时为了能简化普通字符串的编写,如果要设置的值不会和 JSON value 格式冲突、且不包含特殊控制字符(|:})和空白符的字符串时,可以直接填写字面量的字符串,例如 ${QUERY.objectId=HOST}。系统在以下情况中将认为该值为 JSON value 并进行相应解析(即使解析失败):

  • 系统认为可能是数组、对象、数字类型的,即以 [ { " 或数字开头的、或以 - 开头并跟着至少一个数字的;
  • 完全等于 null false true 的。

其它情况将按 literal-string 字面量字符串解析。

注意,literal-string 仅能使用英文字母、数字、_-non-ascii 字符(即可以使用包括中文在内的其它字符)。field 除了上述字符外,还可以使用 .*[]

图解

以下图解参考 https://www.json.org/json-en.html

图解 placeholders

ws: 和 JSON 定义里的 whitespace 一致,即空字符串或连续的空白字符。

变更历史

组件版本变更
brick_next3.0.0不再支持在占位符中使用 CTX