markup / twig-extension-proxy-bundle
一个Symfony扩展包,可以提供对更简单、更常见的已注册Twig扩展的懒加载访问。
Requires
- php: >=7.1
- symfony/framework-bundle: ^2.8|^3|^4
- twig/twig: ^2
Requires (Dev)
- mockery/mockery: dev-master
- phpunit/phpunit: ^6
This package is auto-updated.
Last update: 2024-08-29 03:42:12 UTC
README
一个Symfony扩展包,可以提供对更简单、更常见的已注册Twig扩展的懒加载访问。
为什么需要这个扩展包?
在一个典型的使用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扩展遵守以下规则:
- 扩展必须只声明函数、过滤器测试,并且必须独立于任何注入的依赖项实例化
- 函数、过滤器测试的选项本身不得依赖于注入的依赖项
则它可以声明为一个代理扩展。
以下声明可以以与上面相同的方式实现相同的功能
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。)
已知问题
当前不支持命名参数 - 不幸的是,这些只有在模板编译时间而不是应用编译时间被发现,所以请注意这一点!