dpolac/twig-lambda

为 Twig 和使用它们的过滤器提供 Lambda 表达式

v1.0.0 2018-06-06 16:44 UTC

This package is auto-updated.

Last update: 2024-08-29 04:42:52 UTC


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' #}