VSlimView

VSlim\View

VSlim\View 是 VSlim 内置的轻量模板渲染器。它不追求模板语言的完整性,但已经覆盖 layout、partial、简单控制流和若干内置函数。

真理之源:

创建 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): string
  • render_with_layout($template, $layout, $data): string
  • render_response($template, $data): VSlim\Response
  • render_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}}
  • 复杂业务逻辑不要塞进模板,模板只做轻量展示