创建扩展
默认扩展
为了组织自定义标记和修饰符,您可以创建一个扩展。事实上,Smarty 本身的大部分内容被组织成了两个扩展
- 核心扩展,它提供诸如
{if}、{for}和{assign}等基本语言标记。 - 默认扩展,它提供所有默认修饰符,例如
|escape、|nl2br和|number_format,以及默认启用的标记,例如{html_image}、{mailto}和{textformat},但并非一定是通用的。
** 提示 **
还有“BCPluginsAdapter”扩展,它不会新增任何功能,但是会封装对已弃用方法(如
Smarty\Smarty::addPluginsDir()和Smarty\Smarty::loadFilter())的调用。
编写自己的扩展
为了编写自己的自定义扩展,您必须编写一个实现 Smarty\Extension\ExtensionInterface 的类。但是,通常情况下扩展 Smarty\Extension\Base 会更容易,它为 Smarty\Extension\ExtensionInterface 要求的每种方法提供空实现。这允许您仅覆盖所需的方法。
示例
<?php
use Smarty\Extension\Base;
class MyExtension extends Base {
public function getModifierCompiler(string $modifier): ?\Smarty\Compile\Modifier\ModifierCompilerInterface {
switch ($modifier) {
case 'array_escape': return new MyArrayEscapeModifierCompiler();
case 'array_unescape': return new MyArrayUnescapeModifierCompiler();
}
return null;
}
}
<?php
use Smarty\Extension\Base;
class MyCallablePassThroughExtension extends Base {
public function getModifierCallback(string $modifierName) {
if (is_callable($modifierName)) {
return $modifierName;
}
return null;
}
}
编写扩展允许您向 Smarty 语言添加一组标签、块标签和修饰符。它还允许您以结构化方式注册预置过滤器、后置过滤器和输出过滤器。smarty/smarty 目录中 src/Extension/ 中的文件应该能为您提供编写自己的扩展所需的所有信息。
注册扩展
编写扩展后,将其添加到 Smarty 实例,如下所示
这会将 MyCustomExtension 添加到扩展列表的末尾,这意味着您无法覆盖 Smarty 默认扩展中的标签或修饰符。
如果您要将扩展插入扩展列表顶部,或创建仅包含核心扩展的非常有限的 Smarty 版本,则可以使用 Smarty\Smarty::setExtensions() 覆盖扩展列表。