markup/twig-extension-proxy-bundle

一个Symfony扩展包,可以提供对更简单、更常见的已注册Twig扩展的懒加载访问。

安装量: 40,072

依赖者: 0

建议者: 0

安全性: 0

星标: 0

关注者: 4

分支: 0

公开问题: 0

类型:symfony-bundle

0.1.1 2017-10-04 21:23 UTC

This package is auto-updated.

Last update: 2024-08-29 03:42:12 UTC


README

一个Symfony扩展包,可以提供对更简单、更常见的已注册Twig扩展的懒加载访问。

Build Status

为什么需要这个扩展包?

在一个典型的使用Twig的应用中,即使只有少数扩展在实际执行中会被使用,所有的扩展服务也需要被实例化以添加到Twig环境中。在一个大型应用中,这种方式实例化的Twig扩展数量可能会变得过多,导致内存使用激增和速度减慢。

对于只向Twig环境声明函数、过滤器测试的扩展,这个扩展包提供了一种机制,可以在基于Symfony的应用中懒加载这些扩展。

如何使用

通常,一个Twig扩展将使用如下服务定义添加到应用中:

my_extension:
    class: MyBundle\MyExtension
    arguments:
        - '@my_heavy_dependency'
    tags:
        - { name: twig.extension }

默认情况下,Symfony的TwigBundle将确保my_extension被添加到twig环境服务中。

只要my_extension扩展遵守以下规则:

  1. 扩展必须只声明函数、过滤器测试,并且必须独立于任何注入的依赖项实例化
  2. 函数、过滤器测试的选项本身不得依赖于注入的依赖项

则它可以声明为一个代理扩展。

以下声明可以以与上面相同的方式实现相同的功能

my_extension:
    class: MyBundle\MyExtension
    arguments:
        - '@my_heavy_dependency'
    tags:
        - { name: twig.proxied_extension }

在这个示例中,任何函数、过滤器或测试仍将被声明到twig环境中,但扩展对象本身将只在实际使用其中之一时实例化(因此,my_heavy_dependency也只会在实际使用时实例化)。

分组代理

在需要将Twig扩展组织成代理分组的情况下(以便将某些扩展沙盒到应用特定区域),扩展服务可以标记为可选的"groups"选项。默认组是"default",因此要在其之上声明附加组,应在标签声明中使用逗号分隔的列表。

以下是对上述扩展服务声明但声明一个名为"custom"的组

my_extension:
    class: MyBundle\MyExtension
    arguments:
        - '@my_heavy_dependency'
    tags:
        - { name: twig.proxied_extension, groups: "default, custom" }

然后,可以通过服务ID markup_twig_extension_proxy.proxy.custom访问这个自定义代理扩展。通常,这会添加到一个手动声明的Twig环境中。

代理第三方扩展

通过配置此包

markup_twig_extension_proxy:
    proxify_tagged_extensions: true

应用将选择将标记为twig.extension的任何服务转换为代理扩展(如果扩展兼容,否则将按正常方式包含)。

如果您使用的是低于Symfony 3.2的Symfony版本,您可能需要将此包放在Symfony应用内核的顶部附近,以便转换其他扩展。(实现此功能的编译器通过的优先级为100。)

已知问题

当前不支持命名参数 - 不幸的是,这些只有在模板编译时间而不是应用编译时间被发现,所以请注意这一点!