ThinkPHP의 세 가지 점프 메소드 U(), Redirect(), Success()의 차이점은 무엇인가요? ?
ThinkPHP의 세 가지 점프 메소드 U(), Redirect(), Success()의 차이점은 무엇인가요? ?
u 보조 기능은 URL을 생성하는 것이며 점프 기능은 포함하지 않습니다.
성공과 리디렉션의 차이점은 전자는 점프 템플릿에 웃는 얼굴 패턴이 있다는 점이며, 그 외 차이점은 없습니다.
tp의 소스코드를 보면 답을 찾을 수 있습니다
U 함수는 URL을 생성하는 데 사용됩니다.
공개 리디렉션 기능은 URL을 리디렉션하는 데 사용됩니다.
컨트롤러의 리디렉션 방법은 URL을 리디렉션하는 데에도 사용됩니다. 점프 시간과 점프 텍스트를 지정할 수 있습니다.
컨트롤러의 성공 방법은 리디렉션과 동일하지만 :) 웃는 얼굴이 있습니다.
컨트롤러의 에러 방식은 리다이렉트와 동일하지만, 울고 있는 얼굴이 있습니다 :(
읽기 불편하신 분들은 ThinkPHP의 U함수와 리다이렉트, 성공방법의 차이점을 참고해주세요.
그 전에 설명을 정정하고 싶습니다. U
이것은 메소드가 아니라 함수라고 합니다.
세 가지의 차이점에 대해서는 thinkphp
의 소스 코드를 살펴보겠습니다.
<code class="php">/** * 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) { //省略 }</code>
사실 그의 댓글에서 이미 명확하게 밝혔습니다. 반환 값은 문자열 유형이며 실제로 반환되는 것은 생성된 URL입니다.
액션은 아니고 보조 기능일 뿐입니다.
<code class="php"> /** * 操作错误跳转的快捷方法 * @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); }</code>
success
과 error
모두 dispatchJump
메서드가 캡슐화되어 있음을 여기서 확실히 알 수 있습니다. 차이점은 두 번째 매개변수입니다.
가서dispatchJump
구경해 보세요.
<code class="php"> /** * 默认跳转操作 支持错误导向和正确跳转 * 调用模板显示 默认为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; } } </code>
여기에는 점프 코드가 없으며 단지 템플릿을 로드하고 몇 가지 템플릿 변수를 등록하여 표시하는 것을 볼 수 있습니다.
그럼 어디로 점프하나요? 분명히 템플릿에 있습니다. 기본 템플릿으로 이동해 보겠습니다.
<code class="js">(function(){ var wait = document.getElementById('wait'),href = document.getElementById('href').href; var interval = setInterval(function(){ var time = --wait.innerHTML; if(time <= 0) { location.href = href; clearInterval(interval); }; }, 1000); })();</code>
javascript
의 location.href
을 통해 점프가 이루어지는 것을 볼 수 있습니다. 즉 클라이언트가 구현한 점프이다.
<code class="php"> /** * 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); }</code>
redirect
메서드는 먼저 U
함수를 사용하여 주소를 매개변수로 가져와 redirect
함수에 전달하는 것을 볼 수 있습니다. 이 기능을 캡슐화한 것입니다. redirect
기능으로 가서 살펴보겠습니다.
<code class="php">/** * 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 = "<meta http-equiv='Refresh' content='{$time};URL={$url}'>"; if (0 != $time) { $str .= $msg; } exit($str); } }</code>
http 헤더가 출력되었는지 여부를 확인하는 데 각각 사용되는 두 가지 서버 측 점프 방법이 포함된 매우 짧은 함수를 볼 수 있습니다. 서버측 점프입니다.
U
기능은 URL을 생성하는 데만 사용되며 점프를 수행하지 않습니다. success
메서드 자체는 점프하지 않지만 기본 템플릿에는 점프 javascript
코드가 있기 때문입니다. redirect
메소드는 호출된 서버측 함수에 의해 이루어진 점프입니다.
thinkPHP 공식 문서 보기