wavelo / const-macro
扩展 Latte 模板引擎,通过 `{const ?}` 宏实现对象和数组的解构,灵感来源于 ES2015
v0.9.4
2019-07-08 07:41 UTC
Requires
- php: >=5.5
- latte/latte: ^2.4.0
Requires (Dev)
- nette/tester: ~1.3
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 宏不能包含大括号,对象语法通过冒号字符实现。
语法示例
获取对象值时的优先级
- ArrayAccess 接口
- 对象属性
- 从 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。请参阅完整的 许可证。