Edge 辅助函数与标签
在本指南中,我们将了解 AdonisJS 官方包贡献给 Edge 的辅助函数与标签。Edge 自带的辅助函数不在本指南的涵盖范围内,必须参考 Edge 文档。
request
对正在进行的
HTTP 请求
实例的引用。该属性仅在模板使用 ctx.view.render 方法渲染时才可用。
{{ request.url() }}
{{ request.input('signature') }}
route/signedRoute
使用 URL 构建器 为路由创建 URL 的辅助函数。与 URL 构建器不同,视图辅助函数没有流式 API,并接受以下参数。
| 位置 | 描述 |
| 第 1 个 | 路由标识符或路由模式 |
| 第 2 个 | 路由参数定义为数组或对象。 |
| 第 3 个 |
带有以下属性的选项对象。
|
<a href="{{ route('posts.show', [post.id]) }}">
View post
</a>
<a href="{{
signedRoute('unsubscribe', [user.id], {
expiresIn: '3 days',
prefixUrl: 'https://blog.adonisjs.com'
})
}}">
Unsubscribe
</a>
app
对 Application 实例 的引用。
{{ app.getEnvironment() }}
config
在 Edge 模板中引用配置值的辅助函数。你可以使用 config.has 方法来检查某个键的值是否存在。
@if(config.has('app.appUrl'))
<a href="{{ config('app.appUrl') }}"> Home </a>
@else
<a href="/"> Home </a>
@end
session
session 对象
的只读副本。你无法在 Edge 模板内修改会话数据。session 属性仅在模板使用 ctx.view.render 方法渲染时才可用。
Post views: {{ session.get(`post.${post.id}.visits`) }}
flashMessages
session flash 消息
的只读副本。flashMessages 属性仅在模板使用 ctx.view.render 方法渲染时才可用。
@if(flashMessages.has('inputErrorsBag.title'))
<p>{{ flashMessages.get('inputErrorsBag.title') }}</p>
@end
@if(flashMessages.has('notification'))
<div class="notification {{ flashMessages.get('notification').type }}">
{{ flashMessages.get('notification').message }}
</div>
@end
old
old 方法是 flashMessages.get 方法的简写。
<input
type="text"
name="email"
value="{{ old('name') || '' }}"
/>
t
t 方法由 @adonisjs/i18n 包贡献,用于使用
i18n 类
显示翻译。该方法接受翻译键标识符、消息数据以及回退消息作为参数。
<h1> {{ t('messages.greeting') }} </h1>
i18n
对使用应用默认区域设置配置的 I18n 类实例的引用。不过,
DetectUserLocaleMiddleware
会用一个为当前 HTTP 请求区域设置创建的实例覆盖此属性。
{{ i18n.formatCurrency(200, { currency: 'USD' }) }}
auth
对由 InitializeAuthMiddleware 共享的 ctx.auth 属性的引用。你可以使用此属性来访问关于已登录用户的信息。
@if(auth.isAuthenticated)
<p> {{ auth.user.email }} </p>
@end
如果你要在公共页面(不受 auth 中间件保护)上显示已登录用户的信息,那么你可能需要先静默检查用户是否已登录。
{{-- Check if user is logged-in --}}
@eval(await auth.use('web').check())
@if(auth.use('web').isAuthenticated)
<p> {{ auth.use('web').user.email }} </p>
@end
asset
解析由 Vite 处理的资源的 URL。了解更多关于 在 Edge 模板中引用资源 的信息。
<img src="{{ asset('resources/images/hero.jpg') }}" />
embedImage / embedImageData
embedImage 和 embedImageData 辅助函数由
mail
包添加,仅在渲染模板以发送电子邮件时可用。
<img src="{{
embedImage(app.makePath('assets/hero.jpg'))
}}" />
@flashMessage
@flashMessage 标签为条件性地读取给定键的 flash 消息提供了更好的开发体验(DX)。
与其编写条件判断
@if(flashMessages.has('notification'))
<div class="notification {{ flashMessages.get('notification').type }}">
{{ flashMessages.get('notification').message }}
</div>
@endif
你可以优先使用标签
@flashMessage('notification')
<div class="notification {{ $message.type }}">
{{ $message.message }}
</div>
@end
@error
@error 标签为读取存储在 flashMessages 的 errorsBag 键中的错误消息提供了更好的开发体验(DX)。
与其编写条件判断
@if(flashMessages.has('errorsBag.E_BAD_CSRF_TOKEN'))
<p>{{ flashMessages.get('errorsBag.E_BAD_CSRF_TOKEN') }}</p>
@end
你可以优先使用标签
@error('E_BAD_CSRF_TOKEN')
<p>{{ $message }}</p>
@end
@inputError
@inputError 标签为读取存储在 flashMessages 的 inputErrorsBag 键中的验证错误消息提供了更好的开发体验(DX)。
与其编写条件判断
@if(flashMessages.has('inputErrorsBag.title'))
@each(message in flashMessages.get('inputErrorsBag.title'))
<p>{{ message }}</p>
@end
@end
你可以优先使用标签
@inputError('title')
@each(message in $messages)
<p>{{ message }}</p>
@end
@end
@vite
@vite 标签接受一个入口点路径数组,并返回与之对应的 script 和 link 标签。你提供给 @vite 标签的路径必须与 vite.config.js 文件中注册的路径完全一致。
export default defineConfig({
plugins: [
adonisjs({
// highlight-start
entrypoints: ['resources/js/app.js'],
// highlight-end
}),
]
})
@vite(['resources/js/app.js'])
你可以将 script 标签属性定义为第二个参数。例如:
@vite(['resources/js/app.js'], {
defer: true,
})
@viteReactRefresh
@viteReactRefresh 标签返回一个
用于启用 React HMR 的 script 标签
,适用于使用
@vitejs/plugin-react
包的项目。
@viteReactRefresh()
输出 HTML
<script type="module">
import RefreshRuntime from 'http://localhost:5173/@react-refresh'
RefreshRuntime.injectIntoGlobalHook(window)
window.$RefreshReg$ = () => {}
window.$RefreshSig$ = () => (type) => type
window.__vite_plugin_react_preamble_installed__ = true
</script>
@can/@cannot
@can 和 @cannot 标签允许你通过在 Edge 模板中将能力(ability)名称或策略(policy)名称作为字符串引用来编写授权检查。
第一个参数是能力或策略引用,后面跟着该检查所接受的参数。
另请参阅: 预注册能力与策略
@can('editPost', post)
{{-- Can edit post --}}
@end
@can('PostPolicy.edit', post)
{{-- Can edit post --}}
@end
@cannot('editPost', post)
{{-- Cannot edit post --}}
@end
@cannot('editPost', post)
{{-- Cannot edit post --}}
@end