wavelo/const-macro

扩展 Latte 模板引擎,通过 `{const ?}` 宏实现对象和数组的解构,灵感来源于 ES2015

v0.9.4 2019-07-08 07:41 UTC

This package is not auto-updated.

Last update: 2024-09-14 18:53:04 UTC


README

扩展 Latte 模板引擎,通过 {const ?} 宏实现对象和数组的解构,灵感来源于 ES2015

安装

使用 composer

$ composer require wavelo/const-macro

在给定 Latte\Engine 的配置文件中安装

$latte = new Latte\Engine;
ConstMacro::install($latte->getCompiler());

当使用 Nette 依赖注入时,可以在 latte config.neon 部分安装

latte:
  macros:
    - ConstMacro::install

基本示例

给定变量 $props = ["title"=>"Hello World", "price"=>123.0],你可以使用以下语法

{const [title:, price:, sale:=false] = $props /}
<h1>{$title}</h1>
<div>Price: {$price}</div>
<div n:if="$sale">Sale: YES</div>

渲染如下

<h1>Hello World</h1>
<div>Price: 123</div>

特性

  • {const ?} 宏可以嵌套
  • const 宏为使用的变量应用块作用域
  • 可以在 {foreach ?} 内部使用,而不是 $value(或两者都可以解构和 $value)
  • 每个元素都可以有任意的默认值(甚至是嵌套数组或包含函数调用)
  • 支持嵌套解构
  • 支持 ...rest 操作符
  • 支持数组和对象的解构

更多示例请见测试。简短演示

{foreach $data as $key => [title:, image:[src, width, height], ...rest]}
  {* scope of variables $title, $src, etc. is bounded by foreach block! *}
{/foreach}

{foreach $data as $key => $item, [title:]}
  {* variable $item contains full object/array *}
{/foreach}

{const [title:] = $props}
  {* scope of variable $title is bounded by this block const! *}
{/const}

{const [title:] = $props /} {* does not apply block scope *}

注意事项

语法
  • latte 宏不能包含大括号,对象语法通过冒号字符实现。
语法示例
获取对象值时的优先级
  1. ArrayAccess 接口
  2. 对象属性
  3. 从 Iterator 或 IteratorAggregate 获取的值(仅当适当部分使用 rest 操作符时可用)
rest 操作符
  • rest 操作符只能作为最后一个令牌(即 [title:, image:, ...item] = $item)
  • 当使用 rest 操作符时,值必须是数组或 Traversable 对象
  • rest 值的类型对应于原始值类型(当 Traversable 对象时为 stdClass,否则为数组)
  • 当给定关联数组或至少通过键访问一个值时,键被保留
块作用域
  • 在作用域结束时,之前未定义的变量将为 NULL 值(而不是调用 unset 函数)
  • {foreach ?} 比原始 Latte {foreach} + {const ?} 在循环内性能更好 → {foreach ?} 变量作用域应用于 foreach 循环之外
  • 不成对的 {const ? /} 宏不强制变量作用域
默认值
  • 与 ES2016 相反,默认值不能引用之前声明的标记
  • 在默认值中的单词字符串标记不需要引用(类似于 Latte 短数组语法)
  • 当默认值包含函数/方法调用时,仅在需要时调用(提供的值是 NULL 或键不存在)
  • 此扩展不检查默认值的完整语法有效性
  • 当提供有效语法的默认值时,解析器应正确处理它
其他
  • 从最右侧的标记开始评估(类似于 PHP7 嵌套列表)
  • 需要至少 PHP 5.5,完全支持 PHP 7.0
  • 在解构标量或空值时,会抛出 ConstMacro\RuntimeException(递归应用)
  • 可以通过默认值抑制抛出的异常(例如,[title:, image:[src, width, height]=[]] = $item

许可证

MIT。请参阅完整的 许可证