zenstruck/twig-service-bundle

使函数、静态方法、Symfony服务方法在您的twig模板中可用。

资助包维护!
kbond

安装量: 2,538

依赖项: 0

建议者: 0

安全: 0

星级: 9

关注者: 2

分支: 2

开放问题: 2

类型:symfony-bundle

v1.5.0 2023-11-16 21:31 UTC

This package is auto-updated.

Last update: 2024-09-22 10:53:10 UTC


README

CI codecov

将应用程序服务的数据在twig模板中可用可以通过以下方式实现

  1. 在渲染模板时注入服务/数据。
  2. 创建一个可以访问服务/数据的twig扩展。

对于#1,这并不总是可行的选择(例如,您需要在布局中需要此数据)。对于#2,存在一些样板代码,如果做得不正确(例如,没有使用运行时服务代理重服务),可能会导致性能问题。

此包提供了一种简单的方法来使函数、静态方法、服务方法和甚至整个服务对象在您的twig模板中可用。

安装

composer require zenstruck/twig-service-bundle

注意

如果没有由symfony/flex自动添加,请启用ZenstruckTwigServiceBundle

使用方法

注意

以下函数/过滤器输出的结果将被转义。如果您的函数/过滤器返回您不想转义HTML,请使用|raw过滤器。

作为函数/过滤器的服务方法

您可以使用#[AsTwigFunction]属性标记您配置的服务中的任何公共方法,以便在twig模板中使用fn() twig函数/过滤器。

// ...
use Zenstruck\Twig\AsTwigFunction;

class SomeService
{
    // ...

    #[AsTwigFunction] // will be available as "fn_someMethod()" in twig
    public function someMethod($arg1, $arg2): string
    {
        // ...
    }

    #[AsTwigFunction('alias')] // will be available as "fn_alias()" in twig
    public function anotherMethod($arg1, $arg2): string
    {
        // ...
    }
}

在您的twig模板中,使用fn()函数/过滤器来调用

{# as a function: #}
{{ fn('someMethod', 'foo', 'bar') }}
{{ fn('alias', 'foo', 'bar') }}

{# as a filter: #}
{{ 'foo'|fn('someMethod', 'bar') }}
{{ 'foo'|fn('alias', 'bar') }}

动态函数/过滤器现在可用。以下与上面相同

{# as a function: #}
{{ fn_someMethod('foo', 'bar') }}
{{ fn_alias('foo', 'bar') }}

{# as a filter: #}
{{ 'foo'|fn_someMethod('bar') }}
{{ 'foo'|fn_alias('bar') }}

作为函数/过滤器的用户定义

您可以使用#[AsTwigFunction]属性标记您自己的任何自定义函数,以便在twig模板中使用fn() twig函数/过滤器。

use Zenstruck\Twig\AsTwigFunction;

#[AsTwigFunction] // will be available as "some_function" in twig
function some_function($arg1, $arg2): string
{
    // ...
}

#[AsTwigFunction('alias')] // will be available as "alias" in twig
function another_function($arg1, $arg2): string
{
    // ...
}

在您的twig模板中,使用fn()函数/过滤器来调用

{# as a function: #}
{{ fn('some_function', 'foo', 'bar') }}
{{ fn('alias', 'foo', 'bar') }}

{# as a filter: #}
{{ 'foo'|fn('some_function', 'bar') }}
{{ 'foo'|fn('alias', 'bar') }}

动态函数/过滤器现在可用。以下与上面相同

{# as a function: #}
{{ fn_some_function('foo', 'bar') }}
{{ fn_alias('foo', 'bar') }}

{# as a filter: #}
{{ 'foo'|fn_some_function('bar') }}
{{ 'foo'|fn_alias('bar') }}

第三方函数/过滤器

如果您需要将函数、静态/服务方法在您的twig模板中提供,但这些代码不是您控制的(例如,内部PHP函数/第三方包),您可以在包配置中配置这些。

zenstruck_twig_service:
    functions:
        - strlen # available as "fn_strlen()" in twig
        - [service.id, serviceMethod] # available as "fn_serviceMethod()" in twig
        - [Some\Class, somePublicStaticMethod] # available as "fn_somePublicStaticMethod()" in twig

    # use the array key to customize the name
    functions:
        len: strlen # available as "fn_len()" in twig
        custom: [service.id, serviceMethod] # available as "fn_custom()" in twig
        alias: [Some\Class, somePublicStaticMethod] # available as "fn_alias()" in twig

服务函数

使用#[AsTwigService]标记您希望在twig模板中可用的任何服务。

注意

虽然您可以标记任何服务为twig服务,但建议不要标记与模板无关的服务(例如,存储库)为这种类型。您可以认为twig服务是轻量级-延迟加载的twig扩展函数,其目的是简化大型自定义twig扩展。

namespace App\Twig\Service;

// ...
use Zenstruck\Twig\AsTwigService;

#[AsTwigService(alias: 'posts')]
class PostService
{
    public function __construct(private PostRepository $repo)
    {
    }

    /**
     * @return Post[]
     */
    public function latestPosts(int $number = 10): array
    {
        return $this->repo->findLatestPosts($number);
    }
}

现在您可以在任何twig模板中访问该服务

{% for post in service('posts').latestPosts(5) %}
    {# ... #}
{% endfor %}

每个服务别名都作为动态函数提供。以下与上面相同

{% for post in service_posts().latestPosts(5) %}
    {# ... #}
{% endfor %}

可调用的服务过滤器

您可以通过实现__invoke()将任何twig服务转换为twig过滤器。

namespace App\Twig\Service;

// ...
use Zenstruck\Twig\AsTwigService;

#[AsTwigService(alias: 'image_transformer')]
class ImageTransformer
{
    public function __invoke(string $imageUrl, string ...$transformations): string
    {
        // adds transformation to url and returns new url
    }
}

在您的模板中使用service twig过滤器

{{ url|service('image_transformer', 'square-200', 'watermark') }}

每个服务别名都作为动态过滤器提供。以下与上面相同

{{ url|service_image_transformer('square-200', 'watermark') }}

参数函数

您可以使用提供的parameter() twig函数访问任何服务容器参数。

{% for locale in parameter('kernel.enabled_locales') %}
    {# ... #}
{% endfor %}

zenstruck:twig-service:list 命令

使用此命令列出此包配置的所有函数/过滤器/服务以及它们在您的twig模板中可用。

注意

此命令仅在 debug: true 的情况下可用。

bin/console zenstruck:twig-service:list

Available Functions/Filters
---------------------------

 // As function: call with fn('{alias}', {...args}) or fn_{alias}({...args})

 // As filter: use as {value}|fn('{alias}', {...args}) or {value}|fn_{alias}({...args})

 ---------- ---------------------------------------------
  Alias      Callable
 ---------- ---------------------------------------------
  strlen     strlen
  generate   @router->generate()
 ---------- ---------------------------------------------

Available Services
------------------

 // Access via service('{alias}') or service_{alias}()

 // If invokable, use as {value}|service('{alias}', {...args}) or {value}|service_{alias}({...args})

 ------- -------------------- ------------
  Alias   Service              Invokable?
 ------- -------------------- ------------
  foo     App\SomeService      yes
  bar     App\AnotherService   no
 ------- -------------------- ------------

完整默认组件配置

zenstruck_twig_service:

    # Callables to make available with fn() twig function/filter
    functions:

        # Examples:
        0:                   strlen # available as "strlen"
        alias:               [Some\Class, somePublicStaticMethod] # available as "alias"