Finch 模板事件

Finch 在每次 Jinja 渲染时注入一个全局 $e 对象(模板事件)。该对象提供用于资源、路由、Cookie、语言和各种工具的辅助方法。

全局变量

变量 描述
$language 当前语言代码 — 例如 'en''zh'
$isDebug 应用是否在调试模式下运行
$domain 来自 FinchConfigs 的公共域名

资源辅助方法

{# 加载 CSS 文件 #}
{{ $e.css('/public/css/app.css') }}

{# 加载 JS 文件 #}
{{ $e.js('/public/js/app.js') }}

路由和 URL 辅助方法

{# 根据路由键生成 URL #}
<a href="{{ $e.routeUrl('root') }}">首页</a>
<a href="{{ $e.routeUrl('users.show', {'id': user.id}) }}">个人资料</a>

{# 当前 URL #}
{{ $e.currentUrl() }}
{# 读取 Cookie #}
{% set theme = $e.getCookie('theme', 'light') %}

语言辅助方法

{# 生成语言切换链接 #}
{{ $e.langUrl('en') }}   {# 英文 URL #}
{{ $e.langUrl('zh') }}   {# 中文 URL #}

使用 $t 翻译

使用 $t 从语言文件中获取本地化字符串:

{{ $t('welcome') }}
{{ $t('greeting', {'name': user.name}) }}

语言文件详情请参阅本地化

使用 $n 进行嵌套导航

$n 用于基于已注册路由渲染动态导航:

{{ $n.render('menu_key') }}

工具方法

{# 调试时转储变量值(类似 PHP 的 var_dump)#}
{{ dump(variable) }}

{# 数组转字符串 #}
{{ $e.join(list, ', ') }}

自定义本地事件

对于自定义事件,创建一个 LocalEvent 类并在控制器中注册它:

class AuthEvent extends LocalEvent {
  @override
  Future<void> run(Request rq) async {
    var token = rq.getCookie('auth_token', def: '');
    var user  = await UserModel().findByToken(token: token);
    rq.addParam('currentUser', user);
    rq.addParam('isLoggedIn', user != null);
  }
}
// 在控制器中:
rq.localEvents.add(AuthEvent());
return rq.renderView(path: 'home/index');
{# 在模板中:#}
{% if isLoggedIn %}
  <span>{{ currentUser.name }}</span>
{% endif %}