跳至内容

创建扩展

默认扩展

为了组织自定义标记和修饰符,您可以创建一个扩展。事实上,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 可调用对象作为修饰符

<?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 实例,如下所示

<?php

use Smarty\Smarty;

$smarty = new Smarty();

$smarty->addExtension(new MyCustomExtension());

这会将 MyCustomExtension 添加到扩展列表的末尾,这意味着您无法覆盖 Smarty 默认扩展中的标签或修饰符。

如果您要将扩展插入扩展列表顶部,或创建仅包含核心扩展的非常有限的 Smarty 版本,则可以使用 Smarty\Smarty::setExtensions() 覆盖扩展列表。

<?php

use Smarty\Smarty;

$smarty = new Smarty();

$smarty->setExtensions([
    new Smarty\Extension\CoreExtension(),
    new MyCustomExtension(),
    new Smarty\Extension\DefaultExtension(),
]);