balint777/twig-lambda

为 Twig 提供的 Lambda 表达式及其过滤器

v2.0.0 2020-08-14 14:30 UTC

This package is auto-updated.

Last update: 2024-09-15 00:02: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

注意,如果你使用参数列表,则 _ 变量将不再可用。

以下是可用过滤器及其测试的列表。所有这些都与数组和任何可遍历对象一起工作,并保留它们的键。所有 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' #}