VSlimView
VSlim\View
VSlim\View 是 VSlim 内置的轻量模板渲染器。它不追求模板语言的完整性,但已经覆盖 layout、partial、简单控制流和若干内置函数。
真理之源:
src/mvc.vtests/test_vslim_mvc_view_controller.phpttests/test_vslim_view_layout_include.phpttests/test_vslim_view_control_flow.phpt
创建 View
通过 App
$app = new VSlim\App();
$app->set_view_base_path(__DIR__ . '/views');
$app->set_assets_prefix('/assets');
$view = $app->make_view();
直接创建
$view = new VSlim\View(__DIR__ . '/views', '/assets');
基本配置
set_base_path()base_path()set_assets_prefix()assets_prefix()asset($path)
示例:
echo $view->asset('app.js'); // /assets/app.js
渲染入口
render($template, $data): stringrender_with_layout($template, $layout, $data): stringrender_response($template, $data): VSlim\Responserender_response_with_layout($template, $layout, $data): VSlim\Response
通过 App 也能直接调用:
view()view_with_layout()
最简单模板
模板:
<h1>{{ title }}</h1>
<p>{{ name }}</p>
<script src="{{asset:app.js}}"></script>
渲染:
$body = $view->render('home.html', [
'title' => 'VSlim Demo',
'name' => 'neo',
]);
转义规则
{{ key }}会做 HTML escape{{raw:key}}不做 escape
示例:
<div>{{ payload }}</div>
<div>{{raw:payload}}</div>
如果 payload = '<b>x</b>',第一处会被转义,第二处不会。
include
语法:
{{include:partial.html}}
它会递归渲染 partial。当前实现有深度限制,避免无限 include。
layout / slot
主模板:
<h1>{{ title }}</h1>
layout:
<html>
<body>
<main>{{slot:content}}</main>
</body>
</html>
调用:
$body = $view->render_with_layout('home.html', 'layout.html', [
'title' => 'Demo',
]);
控制流
if
{{if:show_title}}<h1>{{ title }}</h1>{{/if}}
{{if:show_desc}}<p>{{ desc }}</p>{{else}}<p>NO-DESC</p>{{/if}}
for
<ul>
{{for:tags}}<li data-i="{{index}}">{{item}}</li>{{/for}}
</ul>
循环体里可用:
{{item}}{{index}}
内置函数 token
当前内置:
{{trim:key}}{{first:list}}{{last:list}}{{join:list|sep}}{{reduce:list|reducer}}{{reduce:list|reducer|seed}}
示例:
<p>{{trim:title_spaced}}</p>
<p>{{first:tags}}</p>
<p>{{last:tags}}</p>
<p>{{join:tags| + }}</p>
<p>{{reduce:scores|sum}}</p>
<p>{{reduce:scores|count}}</p>
<p>{{reduce:scores|acc+item|10}}</p>
asset token
模板里可以直接写:
<script src="{{asset:app.js}}"></script>
最终会用 assets_prefix 拼接成静态资源路径。
推荐做法
- 用
App->set_view_base_path()统一配置视图目录 - 用
render_response()/App->view()直接拿VSlim\Response - 对用户输入默认使用
{{ key }},只在明确需要时用{{raw:key}} - 复杂业务逻辑不要塞进模板,模板只做轻量展示