
Laravel 默认对 Blade 中的 {{ $message }} 进行 HTML 转义,导致内联链接无法正常渲染;需改用 {!! $message !!} 输出未转义内容,并确保错误消息中包含合法 HTML 结构。
laravel 默认对 blade 中的 `{{ $message }}` 进行 html 转义,导致内联链接无法正常渲染;需改用 `{!! $message !!}` 输出未转义内容,并确保错误消息中包含合法 html 结构。
在 Laravel 表单验证中,若希望将自定义错误消息(如“模型已存在,请查看详情”)渲染为带超链接的富文本(例如 Go to page),关键在于绕过 Blade 的默认 HTML 转义机制。
默认情况下,@error 指令配合 {{ $message }} 会将所有 HTML 字符(如 , &)自动转义为实体(如 <, >),因此你看到的是原始 HTML 标签文本,而非可点击链接。
✅ 正确做法是:
- 在验证规则中构造含 HTML 的错误消息(注意 URL 安全性);
- 在 Blade 模板中使用 {!! $message !!} 替代 {{ $message }},显式输出未转义内容。
示例代码如下:
生成可在 deepbi 沙箱 iframe 内运行或作为独立文件运行的交互式 HTML 页面,使用 `window.deepbi` JS SDK 实现数据查询、空间管理、文件浏览及用户操作。当用户提出以下需求时启用该能力: - 创建 KPI 仪表盘、数据表格、文件浏览器、成员列表、管理页面; - 明确要求“转成 dhtml”、“转译成 HTML”、“把 XX 页面转成……”、“控制台页面”、“管理后台”、“DeepBI 页面迁移”; - 提及位于 `apps/console/src/featur
立即学习“前端免费学习笔记(深入)”;
// 在控制器或 Request 类的 rules() 或 withValidator() 中(推荐统一管理)
'rules' => [
'model_name' => 'required|string|unique:models,model_name',
],
'messages' => [
'model_name.unique' => function ($attribute, $value) use ($request) {
// 确保 $request->model_name 已验证为合法字符串,避免 XSS
$escapedName = e($value); // 或更严格地:Str::slug($value)
$url = route('view.models', ['name' => $escapedName]);
return "模型 <strong>{$escapedName}</strong> 已存在。" .
" <a href=\"{$url}\" class=\"text-primary font-medium hover:underline\">点击查看记录</a>。";
},
],对应 Blade 表单片段需修改为:
<input
type="text"
name="model_name"
class="form-control"
id="exampleFormControlInput1"
placeholder="模型名称"
>
@error('model_name')
<span class="text-danger mt-1 block">{!! $message !!}</span>
@enderror⚠️ 重要安全提醒:
- 使用 {!! !!} 时必须确保 $message 中的 HTML 内容完全可控且已过滤。避免直接拼接用户输入(如 $request->model_name)而未转义——应使用 e() 或 htmlspecialchars() 处理动态值;
- 推荐将链接逻辑封装在自定义验证规则或 FormRequest 的 messages() 方法中,便于复用与测试;
- 若路由参数可能为空或非法,建议添加 route() 的异常兜底(如 try/catch 或预校验),防止 404 或 RouteNotFoundException。
通过以上调整,错误消息即可正确渲染为带样式的可点击链接,兼顾功能性和安全性。


















