重定向与跳转
控制器提供了重定向(redirect)与业务跳转(success / error / response)两类方法。它们都会中断当前方法的后续代码,把响应交给框架统一发送,因此调用之后无需再手动 exit()。
重定向 redirect()
$this->redirect($url) 设置 302 状态码与 Location 响应头,随即中断当前方法。
namespace app\home\controller;
use startmvc\core\Controller;
class IndexController extends Controller
{
public function indexAction()
{
// 用 url() 助手生成地址(自动带上 URL 后缀,如 /home/index/login.html)
$this->redirect($this->url('home/index/login'));
}
public function loginAction()
{
$this->redirect('http://www.baidu.com'); // 重定向到站外地址
}
}
需要 301(永久)等其它状态码时,直接使用响应对象:
use startmvc\core\Response;
return (new Response())->redirect('/new-url', 301);
页面跳转 success() / error()
页面跳转用于业务处理结束后展示提示信息,并跳转到指定页面:
$this->success($msg = '', $url = '', $data = [], $ajax = false); // 操作成功
$this->error($msg = '', $url = '', $data = [], $ajax = false); // 操作失败
$msg—— 提示信息$url—— 跳转地址,留空时返回上一页$data—— 附加的输出数据$ajax—— 输出形式:false输出跳转页面,true输出 JSON 字符串,默认false
两个方法会自动判断当前请求是否为 Ajax 请求(X-Requested-With: XMLHttpRequest):是则输出 JSON,否则输出跳转页面;也可以用 $ajax 手动指定。
public function saveAction()
{
if ($ok) {
$this->success('操作成功', '/home/index/index');
} else {
$this->error('操作失败'); // 不指定地址,默认返回上一页
}
}
数据返回 response()
$this->response($code = '', $msg = '', $url = '', $data = [], $ajax = false);
用法与 success() / error() 一致,多一个 $code 参数,用于 API 接口返回业务状态码:1 代表成功、0 代表失败,也可以自定义自己的编码,方便前台判断。实际上 success() 与 error() 就是对它的封装。
响应格式
非 Ajax 请求:渲染跳转模板 startmvc/core/tpl/jump.php,展示提示信息并在 3 秒后自动跳转。$url 留空时:成功返回上一页并刷新(常用于表单提交后),失败返回上一页并保留表单数据。
Ajax 请求:返回 JSON,响应头为 application/json; charset=utf-8,结构如下:
{
"code": 1,
"msg": "操作成功",
"url": "/home/index/index",
"data": []
}
其中 code 为业务状态码、msg 为提示信息、url 为跳转地址、data 为调用时传入的附加数据。
接口返回的是标准 JSON 字符串,中文不会被转义成 \uXXXX;同时 json_encode 会把正斜杠转义为 \/(如 "url":"\/home\/index\/index"),这是合法 JSON,前端 JSON.parse() 之后仍是普通斜杠。