skrz/templating-engine

像 Smarty,但更快

v1.1.6 2021-03-16 09:09 UTC

This package is auto-updated.

Last update: 2024-09-16 18:35:10 UTC


README

像 Smarty,但更快

为什么?

在最大的捷克最佳价格搜索引擎 Skrz.cz,我们大量使用 Smarty。然而,Smarty 的官方实现不再满足我们的需求,主要是关于性能。

Skrz\Templating\Engine 与 Smarty 语法兼容。并非所有 Smarty 构造都已被实现。你可以把已经实现的部分视为 好的部分

关键设计决策包括

  • 编译时间和运行时间严格分离。当你使用 Smarty 中的 ->display(...)->fetch(...) 时,会发生很多事情。Smarty 会检查模板是否已编译,编译后的代码是否仍然有效,缓存内容是否未被命中等。《Skrz\Templating\Engine》不会做这些。

  • 编译由外部工具管理。在 Skrz,我们使用 Grunt 编译 CSS、JavaScript,以及在开发中编译模板。

  • 编译输出是可自动加载的类,渲染应该封装在方法中。Smarty 将模板编译成一系列函数,它们位于 if 语句中,因此不能声明两次。随着即时编译 PHP 实现的出现(HHVM、PHP-NG、HippyVM),这相当不理想,因为某些优化无法应用(例如,HHVM 可以优化只包含顶级类的文件包含,仅填充类表)。

用法

Skrz\Templating\Engine 仅提供解析器和编译器。请参考测试了解它们的使用方法。

基本上,你只需要创建 ParserContext,解析模板文件,创建 CompilerContext,然后编译到输出文件。

假设,你当前目录中有一个名为 MyTemplate.tpl 的模板,并希望将其编译为 MyTemplate.php

$outputFileName = __DIR__ . "/MyTemplate.php";

$parserContext = new ParserContext();
$parserContext
    ->addPath(__DIR__);
    ->setFile("MyTemplate.tpl");

$compilerContext = new CompilerContext();
$compilerContext
    ->setParserContext($parserContext)
    ->setClassName("MyTemplate")
    ->setTemplate($parserContext->parse())
    ->setOutputFileName($outputFileName)
    ->dump();

许可证

MIT 许可证。请参阅 LICENSE 文件。