一、例如写一个登陆注册的程序,我们想给用户的提示是以弹窗的方式展示。
1.1 在不做任何修改的情况下进行登陆操作是以下图这种方式展示的
1.2 那么我们如果想以弹窗的方式展示如何做呢?(这是我的方式,当然可能有别的方法)。
1.3 使用 ajax 提交数据。 这里使用layer的弹窗。
前端js代码:
$('.btn-success').click(function () {$.post("{:url('login/check')}", $('.form-horizontal').serialize(), function (result) {if (result.code == 1) {layer.msg(result.msg, {icon: 1});} else {layer.msg(result.msg, {icon: 5});}}, 'json');});
后台代码:这里我们使用success就可以实现。
$this->success('登录成功');
返回的效果,这不正是我们想要的效果吗?
二、分析 (查看 TP5中succcess 的源代码)
1、我们可以看到 success中有这样一段代码:
$type = $this->getResponseType();
当我们使用原来的表单的方式提交的时候,我们输出 $type 可以看到 为html
echo $type // html
接着往下看,我们可以看到这段代码,这段代码的意思和上面输出的html一样,那么就会执行这段代码。
最后的返回的 $result是一个html页面。
if ('html' == strtolower($type)) {$result = ViewTemplate::instance(Config::get('template'), Config::get('view_replace_str'))->fetch(Config::get('dispatch_success_tmpl'), $result);}
再往下看可以看到thinkphp使用了 response 响应。
通过上面的执行结果我们进入create() 方法看。下
$response = Response::create($result, $type)->header($header);
这里我输出了$class 打印结果为 : \think\response\Html。
public static function create($data = '', $type = '', $code = 200, array $header = [], $options = []){$type = empty($type) ? 'null' : strtolower($type);$class = false !== strpos($type, '\\') ? $type : '\\think\\response\\' . ucfirst($type);echo $class;die;if (class_exists($class)) {$response = new $class($data, $code, $header, $options);} else {$response = new static($data, $code, $header, $options);}return $response;}
然而在thinkphp中没有 这个类,那么就会执行到 $response = new static($data, $code, $header, $options);,
执行当前类。
response中默认响应的格式为
protected $contentType = 'text/html';
那么我们就可以看到了,是以 text/html 的格式返回的,那么答案也就出来了。
2、如果使用 ajax提交数据。
echo $type; // json
那么在看到thinkphp中存在Json类,是以json格式返回的。答案也就出来了。
返回的数据:
{"code":1,"msg":"登录成功","data":"","url":"http:\/\/localhost\/tp5\/public\/admin\/login\/index.html?username=%E5%95%8A%E6%98%AF%E6%89%93%E7%AE%97%E6%89%93%E7%AE%97&password=asdas+","wait":3}
有什么不懂的,或者有什么问题的,希望大家多多指导。