thoom / phandlebars
基于 Handlebars.js 的模板引擎,适用于 Silex 框架
This package is not auto-updated.
Last update: 2023-11-11 08:19:37 UTC
README
摘要
Phandlebars 允许您在 Silex 应用程序中使用 Handlebars 模板。而不是在 PHP 中重新实现 Handlebars 库,此提供者使用服务器端 JavaScript(主要是 node.js)来编译您创建的 Handlebars 模板(生成的 JS 文件也适用于您的客户端处理),并在服务器上处理模板。
安装
安装分为两部分:PHP 钩子连接到您的 Silex 应用程序和所需的客户端应用程序。
Silex 应用程序
目前有以下选项
- debug:如果 debug 为 true,则编译文件将在每次请求时被覆盖。如果为 false,则仅在编译文件不存在时构建编译文件。
- library:默认情况下,编译的 JS 文件将使用 Handlebars 运行时库。如果您需要使用完整的库(例如,如果您在客户端动态编译),则传递
HandlebarsServiceProvider::LIBRARY_FULL
。 - minify:如果为 true,则脚本将尝试使用
runtime.minify
命令最小化文件。 - path.compiled.client:这是您希望编译的客户端只读 JS 文件的完整文件路径。位置应由您的 Web 用户可写。
- path.compiled.server:这是您希望服务器端编译的 JS 文件存放的完整文件路径。
- path.templates.client:存储所有客户端只读 Handlebars 模板的目录。注意,您的所有模板都应该以 .handlebars 结尾。
- path.templates.server:存储所有服务器端 Handlebars 模板的目录。注意,您的所有模板都应该以 .handlebars 结尾。
- runtime.minify:如果未设置,则脚本将尝试使用
uglifyjs
命令最小化客户端文件。 - runtime.node:如果未设置,则脚本将尝试使用
node
命令运行 node。
例如
$app->register(new Thoom\Provider\HandlebarsServiceProvider(), array(
'handlebars.options' => array(
'debug' => $app['debug'],
'minify' => true,
'path.compiled.client' => $app['cache_dir'] . '/js/handlebars-compiled.js',
'path.compiled.server' => $app['cache_dir'] . '/compiled.js',
'path.templates.client' => __DIR__ . '/templates/client',
'path.templates.server' => __DIR__ . '/templates/server',
)
));
服务器
提供者需要安装一些服务器端 CLI 应用程序以渲染和编译模板。
Node.js
使用您选择的包管理器轻松安装。例如,使用 Ubuntu
$ apt-get install nodejs build-essential
这假设您的 node 可执行文件已安装并且可以通过 node
访问。如果您需要使用不同的命令,请更改 runtime.node
配置选项。
Handlebars.js
您需要使用 NPM 进行安装。
$ apt-get install npm
$ npm install -g handlebars
UglifyJS(可选)
如果您想最小化编译后的模板,则需要安装 UglifyJS。
$ npm install -g uglify-js
如果您更喜欢其他压缩器,请注意它只需要接受来自 STDIN
的数据并将其输出到 STDOUT
。要更改压缩器,请更改 runtime.minify
配置选项。
使用方法
Silex 应用程序
预编译
您可能希望预编译脚本。这可以通过在您的应用程序中使用以下命令调用渲染器来完成
$app['handlebars']->server();
预编译客户端脚本中的 handlebars
$app['handlebars']->client();
服务器端渲染
渲染 "index.handlebars" 的服务器端模板
$app->get('/', function (Application $app) {
return $app['handlebars']->render('index');
})->bind('homepage');
将全局变量(如用户数组)添加到模板中
$app['handlebars']->addGlobal('user', $userArray);
在渲染时传递数据到模板,传递一个数组作为第二个参数
$app['handlebars']->render('index', array('foo' => 'fez'));
要返回除 200 之外的 Http 头,请传递第三个参数
$app['handlebars']->render('not-found', array('foo' => 'fez'), 404);
注意: 由于 Handlebars 模板是在使用 node 的 JavaScript 中处理的,因此您只能传递可序列化为 JSON 的项目。
Handlebars 模板
除了标准的 Handlebars.js 选项 之外,您还有一些其他选项,这些选项允许您扩展模板,类似于 Twig。
要创建主模板('master.handlebars'),请使用 {{#block}} 标签
<html>
<head>
<title>{{#block "title"}}Master Template{{/block}}</title>
</head>
...
在您的子模板中,您将使用 {{#override}} 和 {{extend}} 标签
{{#override "title"}}Child Template{{/override}}
{{extend "master"}}
这将打印
<html>
<head>
<title>Child Template</title>
</head>
...
请注意,与 Twig 模板不同,extend 标签位于脚本的底部。这是由于 Handlebars 解析模板的方式所要求的。
附加标签
path
这个便利表达式会将您所有的 Silex 命名路由全部提取出来,并在模板中使用。
如果您的命名路由 "login" 的路径为 "/login",则您将使用
{{path "login" }}
如果您的命名路由 "section" 的路径为 "/section/{section}",则您将使用
{{path "section" section="my-section" }}