嫩枝为开发人员
这一章描述了API树枝,而不是模板语言。这将是最有用的参考这些实现模板接口的应用程序,而不是那些创建树枝模板。
基础知识
树枝使用一个称为中央对象环境(类\树枝\环境
)。这个类的实例用于存储配置和扩展,和用于加载模板。
大多数应用程序创建一个\树枝\环境
对象在应用程序初始化和使用加载模板。在某些情况下,它可能是有用的,有多个并排的环境,有不同的配置。
典型的方法为应用程序配置树枝来加载模板看起来大致是这样的:
1 2 3 4 5 6
require_once“/道路/ /供应商/ autoload.php”;美元加载程序=新\树枝\装载机\ FilesystemLoader (“/道路/ /模板”);美元嫩枝=新\树枝\环境(美元加载程序,(“缓存”= >“/道路/ / compilation_cache”]);
这将创建一个模板和一个默认的配置环境和加载程序中查找模板/ /模板/ /路径
目录中。不同的加载器是可用的,您也可以编写自己的如果你想从数据库加载模板或其他资源。
请注意
注意到环境的第二个参数是一个数组的选项。的缓存
选项是一个编译缓存目录,树枝缓存编译模板以避免重复检验请求解析阶段。这是非常不同的从缓存中你可能想添加的评估模板。对于这样的需要,您可以使用任何可用的PHP缓存库。
渲染模板
加载模板从树枝环境,调用load ()
方法返回一个\树枝\ TemplateWrapper
实例:
1
美元模板=美元嫩枝- >负载(“index . html”);
呈现的模板变量,调用呈现()
方法:
1
回声美元模板- >呈现([“的”= >“变量”,“去”= >“在这里”]);
请注意
的显示()
方法是一个捷径输出呈现模板。
你也可以加载和渲染模板一举:
1
回声美元嫩枝- >呈现(“index . html”,(“的”= >“变量”,“去”= >“在这里”]);
如果一个模板定义块,它们可以通过单独呈现renderBlock ()
电话:
1
回声美元模板- >renderBlock (“block_name”,(“的”= >“变量”,“去”= >“在这里”]);
环境的选择
当创建一个新的\树枝\环境
实例中,您可以通过一个数组作为构造函数的第二个参数的选择:
1
美元嫩枝=新\树枝\环境(美元加载程序,(“调试”= >真正的]);
以下选项可用:
调试
布尔当设置为
真正的
有一个,生成的模板__toString ()
方法,您可以使用它来显示生成的节点(默认假
)。字符集
字符串(默认为utf - 8
)使用的字符集模板。
缓存
字符串或假
一个绝对路径来存储编译模板,或
假
禁用缓存(默认)。auto_reload
布尔在开发与树枝时,是有用的编译模板只要源代码发生变化。如果你不提供一个值
auto_reload
选项,它将基于自动确定调试
价值。strict_variables
布尔如果设置为
假
静静地,树枝会忽略无效变量(变量或属性/方法,不存在)和替换他们零
价值。当设置为真正的
相反(默认,树枝抛出一个异常假
)。autoescape
字符串设置默认auto-escaping策略(
的名字
,html
,js
,css
,url
,html_attr
模板,或者一个PHP回调,“文件名”并返回逃避策略使用,不能一个回调函数名,以避免碰撞内置逃避策略);将其设置为假
禁用auto-escaping。的的名字
逃避策略决定了逃避策略使用基于模板的模板文件扩展名(这个策略在运行时不产生任何开销auto-escaping是在编译时完成的。)优化
整数国旗表明优化应用(默认
1
——所有启用了优化;将其设置为0
禁用)。
加载器
加载器负责加载模板从文件系统资源等。
编译缓存
所有模板加载器可以缓存编译模板文件系统上为将来重用。它加速树枝很多模板只编译一次。
内置的加载器
这里是一个内置的装入器列表:
\树枝\装载机\ FilesystemLoader
\树枝\装载机\ FilesystemLoader
从文件系统加载模板。该程序可以找到模板文件夹的文件系统和加载它们的首选:
1
美元加载程序=新\树枝\装载机\ FilesystemLoader (美元templateDir);
它还可以寻找模板目录的数组:
1
美元加载程序=新\树枝\装载机\ FilesystemLoader ([美元templateDir1,美元templateDir2]);
这样的配置,树枝首先会查找模板templateDir1美元
如果他们不存在,它将回退寻找他们templateDir2美元
。
您可以通过添加或预先考虑路径目录()
和prependPath ()
方法:
1 2
美元加载程序- >目录美元templateDir3);美元加载程序- >prependPath (美元templateDir4);
文件系统加载器还支持名称空间模板。这允许组织你的模板在不同的命名空间,有自己的模板的路径。
当使用setPaths ()
,目录()
,prependPath ()
方法,指定名称空间作为第二个参数(不指定时,这些方法在“主要”名称空间):
1
美元加载程序- >目录美元templateDir,“管理”);
名称空间模板可以通过特殊的访问@namespace_name / template_path
符号:
1
美元嫩枝- >呈现(“@admin / index . html”[]);
\树枝\装载机\ FilesystemLoader
支持绝对和相对路径。使用相对路径是首选,因为它使缓存键独立项目的根目录(例如,它允许变暖从构建服务器的缓存目录可能不同于一个用于生产服务器):
1
美元加载程序=新\树枝\装载机\ FilesystemLoader (“模板”,getcwd ()。“/ . .”);
请注意
不根路径作为第二个参数传递时,树枝的用途getcwd ()
相对路径。
\树枝\装载机\ ArrayLoader
\树枝\装载机\ ArrayLoader
从PHP数组加载模板。它传递一个字符串数组绑定到模板名称:
1 2 3 4 5 6
美元加载程序=新\树枝\装载机\ ArrayLoader ([“index . html”= >“你好,{{名称}}!”]);美元嫩枝=新\树枝\环境(美元加载程序);回声美元嫩枝- >呈现(“index . html”,(“名字”= >“法”]);
这对于单元测试加载程序非常有用。它也可以用于小型项目存储所有模板在一个PHP文件可能是有意义的。
提示
当使用数组
装载机的缓存机制,你应该知道,每次生成一个新的缓存键一个模板内容“变化”(缓存键是模板的源代码)。如果你不想看到缓存失控,你需要照顾自己清理旧的缓存文件。
\树枝\装载机\ ChainLoader
\树枝\装载机\ ChainLoader
代表们对其他加载器加载模板:
1 2 3 4 5 6 7 8 9 10 11
美元loader1=新\树枝\装载机\ ArrayLoader ([“base.html”= >”{%块内容%}{% endblock %}’]);美元loader2=新\树枝\装载机\ ArrayLoader ([“index . html”= >{%延伸”基地。html" %}{% block content %}Hello {{ name }}{% endblock %}',“base.html”= >永远不会被加载的]);美元加载程序=新\树枝\装载机\ ChainLoader ([美元loader1,美元loader2]);美元嫩枝=新\树枝\环境(美元加载程序);
找一个模板时,树枝就依次尝试每个加载程序并返回模板。当渲染index . html
从上面的例子中,模板树枝将加载它loader2美元
但是,base.html
模板将被加载loader1美元
。
请注意
你也可以添加加载器通过addLoader ()
方法。
创建自己的装载机
所有加载器实现\树枝\装载机\ LoaderInterface
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
接口\嫩枝\加载程序\LoaderInterface{/ * * *返回源上下文逻辑名称对于一个给定的模板。* *@param字符串名称模板逻辑名称* *美元@return* * \树枝\来源@throws\树枝\错误\ LoaderError当美元的名字没有找到* /公共函数getSourceContext(美元的名字);/ * * *被缓存的缓存键使用给定的模板名称。* *@param字符串名称的名称模板加载美元* *@return字符串缓存键* *@throws\树枝\错误\ LoaderError当美元的名字没有找到* /公共函数getCacheKey(美元的名字);/ * * *返回true,如果模板仍然是新鲜的。* *@param字符串命名模板名称*美元@param时间戳缓存时间的最后修改时间美元模板* *@returnbool真如果模板是新鲜,假* *@throws\树枝\错误\ LoaderError当美元的名字没有找到* /公共函数isFresh(美元的名字,美元时间);/ * * *检查如果有模板的源代码,鉴于其名称。* *@param模板的名称字符串$ name检查是否我们可以加载* *@returnbool如果模板的源代码是由加载程序* /公共函数存在(美元的名字);}
的isFresh ()
方法必须返回真正的
如果当前模板缓存仍然新鲜,最后修改时间,或假
否则。
的getSourceContext ()
方法必须返回的一个实例\树枝\源
。
使用扩展
嫩枝树枝扩展包,添加新特性。通过注册一个扩展addExtension ()
方法:
1
美元嫩枝- >addExtension (新\ \树枝\扩展SandboxExtension ());
树枝与以下扩展:捆绑在一起
- TwigExtensionCoreExtension:定义所有树枝的核心特性。
- TwigExtensionDebugExtension:定义了
转储
函数来帮助调试模板变量。 - TwigExtensionEscaperExtension:增加自动output-escaping和逃脱的可能性/ unescape代码块。
- TwigExtensionSandboxExtension:添加一个沙箱模式默认树枝环境,使其安全评价不受信任的代码。
- TwigExtensionProfilerExtension:使内置分析器树枝。
- TwigExtensionOptimizerExtension在编译之前:优化节点树。
-
-
TwigExtensionStringLoaderExtension:定义了
template_from_string
- 函数允许从字符串模板加载模板。
-
TwigExtensionStringLoaderExtension:定义了
核心,排放器,优化器默认注册扩展。
内置的扩展
本节描述的特性增加了内置的扩展。
提示
阅读这一章延长枝学习如何创建您自己的扩展。
排放器扩展
的逃脱者
扩展添加自动输出逃往树枝。它定义了一个标签,autoescape
一个过滤器,生
。
在创建排放器扩展时,你可以打开或关闭全球产出逃避策略:
1 2
美元逃脱者=新\ \树枝\扩展EscaperExtension (“html”);美元嫩枝- >addExtension (美元逃脱者);
如果设置为html
,模板的所有变量(使用逃走了html
逃避策略),除使用生
过滤器:
1
{{article.to_html |生}}
你也可以改变逃离模式在本地使用autoescape
标签:
1 2 3 4 5
{%autoescape“html”%}{{var}}{{var |生}}{# var不会逃脱#}{{var |逃避}}{# var不会double-escaped #}{%endautoescape%}
警告
的autoescape
标签包括文件没有影响。
逃避规则实现如下:
文字(整数、布尔值、数组、…)中使用的模板直接作为变量或滤波器参数不自动转义:
1 2 3 4
{{“嫩枝< br / > "}}{#不会逃脱#}{%集文本= "树枝< br / >“%}{{文本}}{#将逃脱#}
表达式的结果是一个文字或一个变量显著安全从来都不是自动转义:
1 2 3 4 5 6 7 8
{{foo吗?:“嫩枝< br / > < br / >枝"}}{#不会逃脱#}{%集文本= "树枝< br / >“%}{{真的吗?文本:“< br / >枝”}}{#将逃脱#}{{假吗?文本:“< br / >枝”}}{#不会逃脱#}{%集文本= "树枝< br / >“%}{{foo吗?文本|生:“< br / >枝"}}{#不会逃脱#}
对象与一个
__toString
方法转换为字符串并逃脱了。你可以标记一些类和/或接口是通过安全的一些策略EscaperExtension: addSafeClass ()
:1 2 3 4 5 6 7 8 9 10 11
/ /对HTML对象的类Foo标记为安全策略$排放器- > addSafeClass (“Foo”, [' HTML ']);/ /接口的对象Foo标记为安全的HTML策略$排放器- > addSafeClass (“FooInterface”, [' HTML ']);/ /对象的类Foo标记为安全的HTML和javascript策略$排放器- > addSafeClass (“Foo”, [' HTML ', ' JS ']);/ /对所有对象的类Foo标记为安全策略$排放器- > addSafeClass (“Foo”,['所有']);
后逃离应用在印刷之前,任何其他应用过滤:
1
{{var |上}}{#相当于{{var上层| |逃脱}}#}
“原始”滤波器只能使用过滤器链的末尾:
1 2 3
{{var |生|上}}{#将逃脱#}{{var |上|生}}{#不会逃脱#}
不应用自动转义如果最后一个过滤器链是当前上下文(如安全标志。
html
或js
)。逃避
和逃避(html)
对HTML标记安全的,逃避(js)
对JavaScript标记为安全的,生
标记为安全的一切。1 2 3 4 5
{%autoescapejs的%}{{var |逃避(html)}}{#将成为HTML和JavaScript逃脱#}{{var}}{#将逃脱JavaScript #}{{var |逃避(js)}}{#不会double-escaped #}{%endautoescape%}
请注意
注意autoescaping有一些局限性,逃离后应用于表情评估。例如,当处理连接时,