thomasgreen/liquid

PHP 液体模板引擎

1.4.20 2020-04-01 09:11 UTC

README

Liquid 是由 Tobias Lutke 编写的 Ruby 液体模板引擎的 PHP 版本,它是 Shopify 的模板引擎,尽管 PHP 有许多其他模板引擎,包括 Smartys(Liquid 部分受其启发),但 Liquid 的一些优势使其移植变得值得

  • 可读性强、易于理解的语言,适用于任何类型的文档,而不仅仅是 HTML,无需转义。
  • 快速、易于使用和维护。
  • 100% 安全,没有嵌入 PHP 代码的可能性。
  • 干净的面向对象设计,而不是其他模板引擎中常见的面向对象和过程式混合。
  • 独立的编译和渲染阶段,以提高性能。
  • 易于扩展自己的“标签和过滤器”:https://github.com/harrydeluxe/php-liquid/wiki/Liquid-for-programmers
  • 100% 标记与 Ruby 模板引擎兼容,使得模板可用于任何一方。
  • 单元测试:Liquid 完全经过单元测试。库稳定,适用于大型项目。

为什么选择 Liquid?

为什么还需要另一个模板库?

Liquid 是为了满足三个模板库要求而编写的:良好的性能、易于扩展和简单易用。

安装

您可以通过 composer 安装此库。

composer require liquid/liquid

示例模板

{% if products %}
	<ul id="products">
	{% for product in products %}
	  <li>
		<h2>{{ product.name }}</h2>
		Only {{ product.price | price }}

		{{ product.description | prettyprint | paragraph }}

		{{ 'it rocks!' | paragraph }}

	  </li>
	{% endfor %}
	</ul>
{% endif %}

如何使用 Liquid

主要类是 Liquid::Template 类。与 Liquid 模板一起工作的两个独立阶段:解析和渲染。这里是一个简单的示例

use Liquid\Template;

$template = new Template();
$template->parse("Hello, {{ name }}!");
echo $template->render(array('name' => 'Alex'));

// Will echo
// Hello, Alex!

要查看更多示例,请查看 examples 目录或原始 Ruby 实现仓库的 wiki 页面

高级使用

您可能希望添加缓存层(至少是请求范围的缓存层),启用上下文感知的自动转义,并从磁盘加载具有完整文件名的包含文件。

use Liquid\Liquid;
use Liquid\Template;
use Liquid\Cache\Local;

Liquid::set('INCLUDE_SUFFIX', '');
Liquid::set('INCLUDE_PREFIX', '');
Liquid::set('INCLUDE_ALLOW_EXT', true);
Liquid::set('ESCAPE_BY_DEFAULT', true);

$template = new Template(__DIR__.'/protected/templates/');

$template->parse("Hello, {% include 'honorific.html' %}{{ plain-html | raw }} {{ comment-with-xss }}");
$template->setCache(new Local());

echo $template->render([
    'name' => 'Alex',
    'plain-html' => '<b>Your comment was:</b>',
    'comment-with-xss' => '<script>alert();</script>',
]);

输出结果

Hello, Mx. Alex
<b>Your comment was:</b> &lt;script&gt;alert();&lt;/script&gt;

请注意,自动转义不是 Liquid 的标准功能:请谨慎使用。

同样,以下代码片段将解析并渲染 templates/home.liquid,同时将解析结果存储在类本地缓存中

\Liquid\Liquid::set('INCLUDE_PREFIX', '');

$template = new \Liquid\Template(__DIR__ . '/protected/templates');
$template->setCache(new \Liquid\Cache\Local());
echo $template->parseFile('home')->render();

如果您多次渲染相同的模板至少十二次,类本地缓存将为您带来一些毫秒级的时间加速,具体取决于您模板的复杂性。

您可能需要扩展 Liquid\Template,以在 Liquid::set 的一处初始化您所做的所有操作。

自定义过滤器

添加过滤器从未如此简单。

$template = new Template();
$template->registerFilter('absolute_url', function ($arg) {
    return "https://www.example.com$arg";
});
$template->parse("{{ my_url | absolute_url }}");
echo $template->render(array(
    'my_url' => '/test'
));
// expect: https://www.example.com/test

要求

  • PHP 7.0+

某些早期版本可以与 PHP 5.3/5.4/5.5/5.6 一起使用,尽管它们不再受支持。

问题

有错误?请在此 GitHub 上创建一个问题!

https://github.com/kalimatas/php-liquid/issues

分支说明

此分支基于 Harald Hanek 的 php-liquid

它包含几个改进

  • 命名空间
  • 通过 composer 安装
  • 新标准过滤器
  • 添加了 raw 标签

任何帮助都受欢迎!