jump() 不是 ThinkPHP 6 推荐的跳转方式,它是 TP5 遗留的模板函数,仅在 success()/error() 渲染的模板中配合 {:jump()} 使用,本质为 JS 伪跳转;TP6 应统一使用 redirect() 实现标准 HTTP 重定向。

jump() 方法不是 ThinkPHP 6 中推荐使用的跳转方式,它本质上是 ThinkPHP 5 时代的遗留函数,仅在模板中配合 success() 或 error() 使用,且在 TP6 默认环境下已不生效。
它不直接属于 Controller 类的原生方法,也不参与 HTTP 重定向流程,而是依赖模板引擎渲染一个含 JS 跳转逻辑的 HTML 页面(如 dispatch_jump.tpl),属于“前端伪跳转”。
jump() 的真实定位和使用场景
- 它不是控制器里可直接调用的跳转函数
- 不支持链式调用、不兼容 API/CLI 场景、无法在 JSON 响应中使用
- 只有在控制器中先调用
$this->success()或$this->error()渲染模板后,模板里再写{:jump()}才会起作用 - TP6 默认模板中甚至没有定义
jump标签,强行使用会报TemplateNotFoundException
✅ 正确用法示例(TP5 风格,TP6 需手动启用或自定义模板):
$this->success('操作成功', 'user/profile', [], 2); // 模板中需存在 {:jump()} 才触发 JS 跳转
为什么不要在 Controller 中直接写 jump()
-
jump()没有对应 PHP 层的响应头控制,不能替代redirect() - 无法携带 session 闪存数据(如
->with('msg', 'xxx')) - 中文参数、特殊符号易出错,且无自动 URL 编码机制
- 禁用 JavaScript 时完全失效,页面卡在提示页不动
替代方案:用 redirect() 实现更可靠跳转
redirect() 是 TP6 官方主推的跳转方式,底层走标准 HTTP 302 重定向:
立即学习“PHP免费学习笔记(深入)”;
- 支持路由名跳转:
redirect('index/user/index') - 支持完整 URL:
redirect('https://example.com/login')(注意必须带http://或https://) - 支持带参跳转:
redirect('order/detail', ['id' => 123, 'tab' => 'log']) - 可链式传递消息:
redirect('user/profile')->with('msg', '更新完成') - 兼容所有运行环境(Web/API/CLI)
⚠️ 注意:如果配置了 url_html_suffix => '.html',redirect('article/read') 会实际跳到 /article/read.html,这不是 bug,是设计行为。
总结建议
- 控制器内跳转统一用
redirect(),清晰、稳定、无依赖 -
success()/error()仅用于需要友好提示的表单操作场景(如登录、提交),但要记得return终止后续执行 - 不要在控制器中尝试调用
jump(),它不属于 Controller 的方法,也不该被当作跳转入口 - 如需自定义跳转模板,修改
dispatch_success_tmpl和dispatch_error_tmpl配置,并确保模板中包含跳转逻辑(JS 或 meta refresh)
不复杂但容易忽略。



















