dpolac / twig-lambda
为 Twig 和使用它们的过滤器提供 Lambda 表达式
Requires
- php: ^5.6 || ^7.0
- dpolac/dictionary: ^1.0
- twig/twig: ^1.0 || ^2.0
Requires (Dev)
- phpunit/phpunit: ~5.0
README
为 Twig 和使用它们的过滤器提供 Lambda 表达式
快速示例
按年龄排序列出所有作者的名称
{% for author in articles|map(=> _.author)|unique_by('===')|sort_by(=> _.age) %} * {{ author.name }}, {{ author.age }} {% endfor %}
从指定字母开始的元素计数
{% for key, count in ['foo', 'bar', 'foobar']|countBy(=> _|first|capitalize) %} * {{ count }} elements start from {{ key }}. {% endfor %}
安装
通过 Composer 安装
composer require dpolac/twig-lambda
将扩展添加到 Twig
$twig->addExtension(new \DPolac\TwigLambda\LambdaExtension());
... 或者如果你使用 Symfony,将以下内容添加到你的 services.yml
配置文件中
services: # ... dpolac.twig_lambda.extension: class: DPolac\TwigLambda\LambdaExtension tags: [ { name: twig.extension } ]
使用方法
Lambda 表达式
要创建 Lambda 表达式,请将任何有效的 Twig 表达式与 =>
操作符连接。在 Lambda 表达式内部,你可以使用外部变量。还有两个特殊变量可用
_
(单下划线)- 第一个参数,__
(双下划线)- 从零计数的参数数组。
=> _.name
=> _ * 2
=> _|first
=> 'foobar'
=> _ is even
=> __[0] + __[1]
要创建具有参数列表的 Lambda 表达式,请将其添加到 =>
操作符之前。使用分号分隔多个参数。你可以使用括号来提高可读性。
x => x + 1
(book) => book.author
arg1; arg2 => arg1 ~ arg2
(a; b; c) => a + b - c
注意,如果你使用参数列表,则 _
变量不再可用。
以下是可用的过滤器和测试列表。所有这些都与数组和任何 Traversable 对象一起工作,并保留其键。所有 Lambda 都使用两个参数调用:元素和键。
|map
别名: |select
签名: array|map(lambda)
将给定的函数应用于每个元素,并返回结果数组。
{% for i in [1, 2, 3, 4]|map(=> _ * 2) %} {{ i }} {# prints '2 4 6 8' #} {% endfor %}
|filter
别名: |where
签名: array|filter(lambda)
返回通过 Lambda 指定的测试的元素数组。
{% for i in [1, 2, 3, 4, 5, 6]|filter(=> _ is even) %} {{ i }} {# prints '2 4 6' #} {% endfor %}
|unique_by
签名: array|unique_by(lambda|'==='|'==')
返回唯一元素数组。唯一性检查使用传递的 Lambda。如果传递了字符串 '==' 或 '===',则使用 PHP 操作符 == 或 ===。
Lambda 应有两个参数 - 检查的项目。元素键也作为第三个和第四个参数传递。
{% for i in [1, 2, 2, 3, 1]|unique_by((i1;i2) => i1 == i2) %} {{ i }} {# prints '1 2 3' #} {% endfor %}
equivalent
{% for i in [1, 2, 2, 3, 1]|unique_by('==') %} {{ i }} {# prints '1 2 3' #} {% endfor %}
|group_by
签名: array|group_by(lambda)
按 Lambda 的结果对数组进行分组。
{% for key, group in ['foo', 'bar', 'foobar', 'barbar']|group_by(=> _|first|capitalize) %} = {{ key }} {% for i in group %} * {{ i }} {% endfor %} {% endfor %}
将产生
= F
* foo
* foobar
= B
* bar
* barbar
|sort_by
签名: array|sort_by(lambda[, direction = 'ASC'])
按 Lambda 返回的值对数组进行排序。方向可以是 'ASC' 或 'DESC'。
{% for i in ['bar', 'fo', 'foobar', 'foob']|sort_by(=> _|length, 'DESC') %} {{ i }} {# prints 'foobar foob bar fo' #} {% endfor %}
|count_by
签名: array|count_by(lambda)
将数组分组并返回每个组中的对象数量。
如果 Lambda 返回 true、false 或 null,则将其转换为字符串 'true'、'false' 或 'null'。浮点数将转换为整数。
{% for key, count in ['foo', 'bar', 'foobar']|count_by(=> _|first|capitalize) %} * {{ count }} elements start from {{ key }}. {% endfor %}
将产生
* 2 elements start from F
* 1 elements start from B
is any
签名: array is any(lambda)
如果 Lambda 对数组中的任何元素返回 true,则返回 true。
如果数组为空,则返回 false。
{{ [1, 2, 3] is any(=> _ is even) ? "There is even element in the array." }} {# prints 'There is even element in the array.' #}
is every
签名: array is every(lambda)
如果 Lambda 对数组中的每个元素返回 true,则返回 true。
如果数组为空,则返回 true。
{{ [1, 2, 3] is every(=> _ > 0) ? "All elements in the array are positive." }} {# prints 'All elements in the array are positive.' #}
call()
签名: call(lambda [, arguments:array])
调用 Lambda 并返回其结果。你可以提供参数数组。
此函数提供以允许创建将 Lambda 作为参数的 twig 宏。
{{ call(=> _ * 2, [10]) }} {# prints '20' #} {{ call(=> _.foo, [{foo: 12}]) }} {# prints '12' #}