如何编写一个自定义树枝扩展
编辑本页如何编写一个自定义树枝扩展
树枝的扩展允许创建自定义函数,过滤器,和更多的使用在你的Twig模板。在编写你自己的Twig扩展之前,检查你需要的过滤器/函数是否已经在:
- 的默认的枝条过滤器和函数;
- 的Symfony添加的树枝过滤器和函数ob娱乐下载;
- 的官方树枝扩展与字符串、HTML、Markdown、国际化等相关。
创建扩展类
假设您想要创建一个名为价格
将数字格式化为货币:
1 2 3 4
{{产品。价格|price }}{#传入3个可选参数#}{{产品。价格|price(2, ',', '.') }}
创建一个可扩展的类AbstractExtension
然后填入逻辑:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
/ / src /理解/ AppExtension.php名称空间应用程序\嫩枝;使用嫩枝\扩展\AbstractExtension;使用嫩枝\TwigFilter;类AppExtension扩展AbstractExtension{公共函数getFilters(){返回[新TwigFilter (“价格”, ($这,“formatPrice”)));}公共函数formatPrice(浮点$数量, int$小数=0、字符串$decPoint=“。”、字符串$thousandsSep=”、“):字符串{$价格= number_format ($数量,$小数,$decPoint,$thousandsSep);$价格=“美元”.$价格;返回$价格;}}
如果要创建函数而不是筛选器,请定义getFunctions ()
方法:
12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20
/ / src /理解/ AppExtension.php名称空间应用程序\嫩枝;使用嫩枝\扩展\AbstractExtension;使用嫩枝\TwigFunction;类AppExtension扩展AbstractExtension{公共函数getFunctions(){返回[新TwigFunction (“区域”, ($这,“calculateArea”)));}公共函数calculateArea(int$宽度, int$长度):int{返回$宽度*$长度;}}
提示
除了自定义过滤器和函数,您还可以注册全局变量.
将扩展注册为服务
接下来,将类注册为服务并标记为twig.extension
.如果你在用默认的服务。yaml的配置,你完蛋了!ob娱乐下载Symfony将自动了解您的新服务并添加标记。
你现在可以开始在任何Twig模板中使用你的过滤器。可选地,执行以下命令来确认您的新过滤器已成功注册:
1 2 3 4 5
#显示所有关于Twig的信息$PHP bin/控制台调试:twig#只显示特定过滤器的信息$PHP bin/控制台调试:twig——filter=price
创建惰性加载的树枝扩展
1.35
在Twig 1.35.0和2.4.4中引入了对惰性加载扩展的支持。
在Twig扩展类中包含自定义过滤器/函数的代码是创建扩展的最简单方法。然而,在呈现任何模板之前,Twig必须初始化所有扩展,即使模板没有使用扩展。
如果扩展没有定义依赖关系(也就是说,如果你没有在扩展中注入服务),性能不会受到影响。然而,如果扩展定义了大量复杂的依赖关系(例如那些建立数据库连接的依赖关系),性能损失可能是显著的。
这就是为什么Twig允许将扩展定义与其实现解耦。与前面的示例相同,第一个更改是删除formatPrice ()
中定义的PHP可调用对象getFilters ()
:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/ / src /理解/ AppExtension.php名称空间应用程序\嫩枝;使用应用程序\嫩枝\AppRuntime;使用嫩枝\扩展\AbstractExtension;使用嫩枝\TwigFilter;类AppExtension扩展AbstractExtension{公共函数getFilters(){返回[//这个过滤器的逻辑现在在一个不同的类中实现新TwigFilter (“价格”, (AppRuntime::类,“formatPrice”)));}}
然后,创建新的AppRuntime
类(这不是必需的,但这些类的后缀是运行时
按照惯例),并包括前面的逻辑formatPrice ()
方法:
12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20 21
/ / src /理解/ AppRuntime.php名称空间应用程序\嫩枝;使用嫩枝\扩展\RuntimeExtensionInterface;类AppRuntime实现了RuntimeExtensionInterface{公共函数__construct(){//这个简单的例子没有定义任何依赖项,但是在你自己的依赖项中//扩展,你需要使用这个构造函数注入服务}公共函数formatPrice(浮点$数量, int$小数=0、字符串$decPoint=“。”、字符串$thousandsSep=”、“):字符串{$价格= number_format ($数量,$小数,$decPoint,$thousandsSep);$价格=“美元”.$价格;返回$价格;}}
如果您使用默认设置services.yaml
配置,这将已经工作!否则,创建服务对于这门课来说标记你的服务与twig.runtime
.