日常跳转只用redirect(),jump()在tp6中默认不生效且仅限模板内配合success()/error()使用;redirect()支持路由名、完整url、带参跳转三种写法,需注意协议、后缀、中文编码及必须return返回response对象。

日常跳转只用 redirect(),别碰 jump()——它在 TP6 里默认不生效,且只配和模板里的 success()/error() 一起用,控制器里直接调会报 TemplateNotFoundException。
redirect() 的三种写法和路径陷阱
TP6 的 redirect() 本质是封装了 Response::create()->redirect(),所有行为受路由配置和 URL 生成规则影响。路径写错、协议漏写、中文没编码,都会导致跳转失败或链接异常。
- 跳转到路由名(推荐):
redirect('user/profile')—— 按「控制器/方法」写,不加index.php,不带域名;若启用了url_html_suffix(如.html),实际跳向/user/profile.html,这不是 bug - 跳转到完整 URL:
redirect('https://example.com/login')—— 必须带协议,否则会被当成相对路径拼到当前域名下,比如写成redirect('//example.com/login')或redirect('/login')都可能跳歪 - 带参数跳转:
redirect('order/detail', ['id' => 123, 'tab' => 'log'])—— 参数自动拼 query string,但http_build_query()不处理中文,含中文时得先urlencode(),例如['name' => urlencode('张三')]
为什么写了 redirect 却没跳?静默失败的常见原因
redirect() 是靠设置 Location 响应头实现的,一旦响应体已开始输出(哪怕一个空格、BOM 或调试 echo),头就发不出去,框架也不会报错,而是直接忽略指令——页面卡住、URL 不变、控制台无提示,就是这个原因。
- 控制器里提前有
echo、var_dump(),或开启了调试模式导致输出了 Trace 信息 - 前置中间件里调用了
Response::create()->send()或写了exit - 在
__destruct()、finally块里调用redirect()—— 此时响应早已结束 - 用了 Swoole/RoadRunner 等常驻进程服务器时,需确保没有其他协程并发写响应体
API 接口里不能用 redirect()?那怎么跳?
不能。HTTP API 返回的是 JSON,不是 HTML 页面,redirect() 强制返回 302 响应头 + 空 body,前端 fetch/fetcher 通常不会自动跟随重定向,而且多数 API 客户端(如 Axios)默认关闭 redirect: 'follow'。强行用会导致前端收不到数据、状态码误判、甚至跨域问题。
- 正确做法:API 控制器里统一返回标准 JSON 结构,比如
{ "code": 302, "redirect_url": "/login" },由前端 JS 判断并跳转 - 如果非要在服务端跳(极少见),只能退回到原生
header('Location: ...');+exit,但必须确保没任何输出,且不依赖框架的 session 刷新、URL 生成等能力 - 命令行(CLI)环境调用
redirect()会直接抛异常,它只适用于 HTTP 请求上下文
带数据跳转:with() 和 remember() 怎么用才安全
with() 是把数据存进 Session 闪存(flash),仅对下一次请求有效;remember() 是记下当前 URL 到 session,供后续 redirect()->restore() 调用。两者都依赖 session 正常工作,且不能和 JSON 接口混用。
-
return redirect('user/profile')->with('msg', '操作成功');→ 下次请求中session('msg')可取,再下一次就没了 -
return redirect('login')->remember();→ 登录成功后执行return redirect()->restore();,就能跳回原始页面 - 注意:如果跳转目标页本身也调用了
with()或remember(),可能覆盖原有闪存或记忆地址,顺序和用途要理清
最易被忽略的一点:redirect() 返回的是 Response 对象,必须 return 出去,否则框架会继续执行后续代码,甚至尝试渲染模板,导致跳转失效或 500 错误。别只写 redirect(...) 就完事。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











