您好,欢迎访问一九零五行业门户网

ThinkPHP中U()和redirect()还有success()三个跳转方法有什么区别??

thinkphp中u()和redirect()还有success()三个跳转方法有什么区别??
回复内容: thinkphp中u()和redirect()还有success()三个跳转方法有什么区别??
u助手函数是生成url,不涉及跳转功能。
success和redirect的区别就是前者在跳转模板上有个笑脸图案,其他没任何区别。
你可以看看tp的源代码就能找到答案的
u函数用于生成url。
公共的redirect函数用于重定向url。
控制器中的redirect方法,也用于重定向url,可以指定跳转时间,跳转文字。
控制器中的success方法,和redirect一样,但是有个:)的笑脸。
控制器中的error方法,和redirect一样,但是有个:(的哭脸
如果这里阅读不方便,请访问thinkphp中u函数和redirect、success方法的区别。
在此之前我要纠正一下你的描述,u这个不叫方法,叫函数。
关于这三者的区别,我们可以看下thinkphp的源代码。
u函数/** * url组装 支持不同url模式 * @param string $url url表达式,格式:'[模块/控制器/操作#锚点@域名]?参数1=值1&参数2=值2...' * @param string|array $vars 传入的参数,支持数组和字符串 * @param string|boolean $suffix 伪静态后缀,默认为true表示获取配置值 * @param boolean $domain 是否显示域名 * @return string */function u($url = '', $vars = '', $suffix = true, $domain = false){//省略}
其实他的注释已经说的很清楚了,返回值是一个string类型,其实返回的是生成的网址。
他不是一个动作,只是一个辅助函数而已。
success方法 /** * 操作错误跳转的快捷方法 * @access protected * @param string $message 错误信息 * @param string $jumpurl 页面跳转地址 * @param mixed $ajax 是否为ajax方式 当数字时指定跳转时间 * @return void */ protected function error($message = '', $jumpurl = '', $ajax = false) { $this->dispatchjump($message, 0, $jumpurl, $ajax); } /** * 操作成功跳转的快捷方法 * @access protected * @param string $message 提示信息 * @param string $jumpurl 页面跳转地址 * @param mixed $ajax 是否为ajax方式 当数字时指定跳转时间 * @return void */ protected function success($message = '', $jumpurl = '', $ajax = false) { $this->dispatchjump($message, 1, $jumpurl, $ajax); }
这里可以很明显的看到,success和error都是封装的dispatchjump方法,区别是第二个参数。
我们再去dispatchjump看看。
/** * 默认跳转操作 支持错误导向和正确跳转 * 调用模板显示 默认为public目录下面的success页面 * 提示页面为可配置 支持模板标签 * @param string $message 提示信息 * @param boolean $status 状态 * @param string $jumpurl 页面跳转地址 * @param mixed $ajax 是否为ajax方式 当数字时指定跳转时间 * @access private * @return void */ private function dispatchjump($message, $status = 1, $jumpurl = '', $ajax = false) { if (true === $ajax || is_ajax) { // ajax提交 $data = is_array($ajax) ? $ajax : array(); $data['info'] = $message; $data['status'] = $status; $data['url'] = $jumpurl; $this->ajaxreturn($data); } if (is_int($ajax)) { $this->assign('waitsecond', $ajax); } if (!empty($jumpurl)) { $this->assign('jumpurl', $jumpurl); } // 提示标题 $this->assign('msgtitle', $status ? l('_operation_success_') : l('_operation_fail_')); //如果设置了关闭窗口,则提示完毕后自动关闭窗口 if ($this->get('closewin')) { $this->assign('jumpurl', 'javascript:window.close();'); } $this->assign('status', $status); // 状态 //保证输出不受静态缓存影响 c('html_cache_on', false); if ($status) { //发送成功信息 $this->assign('message', $message); // 提示信息 // 成功操作后默认停留1秒 if (!isset($this->waitsecond)) { $this->assign('waitsecond', '1'); } // 默认操作成功自动返回操作前页面 if (!isset($this->jumpurl)) { $this->assign(jumpurl, $_server[http_referer]); } $this->display(c('tmpl_action_success')); } else { $this->assign('error', $message); // 提示信息 //发生错误时候默认停留3秒 if (!isset($this->waitsecond)) { $this->assign('waitsecond', '3'); } // 默认发生错误的话自动返回上页 if (!isset($this->jumpurl)) { $this->assign('jumpurl', javascript:history.back(-1);); } $this->display(c('tmpl_action_error')); // 中止执行 避免出错后继续执行 exit; } }
我们看到了,这里面没有任何关于跳转的代码,只是装载了模板,注册了几个模板变量并显示而已。
那么它是在哪里跳转的呢?显而易见地,是在模板上。我们去默认模板看看:
(function(){var wait = document.getelementbyid('wait'),href = document.getelementbyid('href').href;var interval = setinterval(function(){ var time = --wait.innerhtml; if(time
可以看到,是通过javascript的location.href进行的跳转。即他是客户端实现的跳转。
redirect 方法 /** * action跳转(url重定向) 支持指定模块和延时跳转 * @access protected * @param string $url 跳转的url表达式 * @param array $params 其它url参数 * @param integer $delay 延时跳转的时间 单位为秒 * @param string $msg 跳转提示信息 * @return void */ protected function redirect($url, $params = array(), $delay = 0, $msg = '') { $url = u($url, $params); redirect($url, $delay, $msg); }
我们可以看到,redirect方法先是用u函数获取了地址做参数,传给了redirect函数。是对这个函数的封装。
我们再去redirect函数看看。
/** * url重定向 * @param string $url 重定向的url地址 * @param integer $time 重定向的等待时间(秒) * @param string $msg 重定向前的提示信息 * @return void */function redirect($url, $time = 0, $msg = ''){ //多行url地址支持 $url = str_replace(array(\n, \r), '', $url); if (empty($msg)) { $msg = 系统将在{$time}秒之后自动跳转到{$url}!; } if (!headers_sent()) { // redirect if (0 === $time) { header('location: ' . $url); } else { header(refresh:{$time};url={$url}); echo ($msg); } exit(); } else { $str = ; if (0 != $time) { $str .= $msg; } exit($str); }}
可以看到一个很短的函数,有两种服务端跳转方式,分别用于是否已输出了http头部的情况。是服务端的跳转。
总结u函数只会用来生成一个url,不会执行跳转。
success方法本身不会跳转,而是因为默认的模板上有跳转的javascript代码。
redirect方法是调用的服务端函数进行的跳转。
看thinkphp的官方文档
其它类似信息

推荐信息