Was sind die Unterschiede zwischen den drei Sprungmethoden U(), Redirect() und Success() in ThinkPHP? ?
Was sind die Unterschiede zwischen den drei Sprungmethoden U(), Redirect() und Success() in ThinkPHP? ?
Ihre Assistentenfunktion besteht darin, eine URL zu generieren und beinhaltet keine Sprungfunktion.
Der Unterschied zwischen Erfolg und Weiterleitung besteht darin, dass ersteres ein Smiley-Gesichtsmuster auf der Sprungvorlage aufweist und es keinen weiteren Unterschied gibt.
Die Antwort finden Sie im Quellcode von tp
Die U-Funktion wird zum Generieren einer URL verwendet.
Die öffentliche Weiterleitungsfunktion wird zum Umleiten von URLs verwendet.
Die Umleitungsmethode im Controller wird auch zum Umleiten der URL verwendet. Sie können die Sprungzeit und den Sprungtext angeben.
Die Erfolgsmethode im Controller ist die gleiche wie die Weiterleitung, jedoch mit einem :) Smiley.
Die Fehlermethode im Controller ist die gleiche wie die Umleitung, aber es gibt ein weinendes Gesicht von :(
Wenn es Ihnen unangenehm ist, hier zu lesen, schauen Sie sich bitte den Unterschied zwischen U-Funktion und Weiterleitungs- und Erfolgsmethoden in ThinkPHP an.
Zuvor möchte ich Ihre Beschreibung korrigieren U
Dies wird nicht als Methode, sondern als Funktion bezeichnet.
Was die Unterschiede zwischen den dreien betrifft, können wir einen Blick auf den Quellcode von thinkphp
werfen.
<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>
Tatsächlich haben seine Kommentare bereits sehr deutlich gemacht, dass der Rückgabewert ein Zeichenfolgentyp ist und tatsächlich die generierte URL zurückgegeben wird.
Es handelt sich nicht um eine Aktion, sondern nur um eine Hilfsfunktion.
<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>
Hier ist deutlich zu erkennen, dass es sich sowohl bei success
als auch bei error
um gekapselte dispatchJump
-Methoden handelt. Der Unterschied liegt im zweiten Parameter.
Lass uns gehen dispatchJump
und einen Blick darauf werfen.
<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>
Wir sehen, dass es hier keinen Sprungcode gibt, er lädt lediglich die Vorlage, registriert ein paar Vorlagenvariablen und zeigt sie an.
Wohin springt es also? Offensichtlich steht es auf der Vorlage. Gehen wir zur Standardvorlage:
<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>
Sie können sehen, dass der Sprung durch javascript
s location.href
erfolgt. Das heißt, es handelt sich um einen vom Client implementierten Sprung.
<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>
Wir können sehen, dass die Methode redirect
zunächst die Funktion U
verwendet, um die Adresse als Parameter abzurufen, und diese dann an die Funktion redirect
übergibt. Es handelt sich um eine Kapselung dieser Funktion.
Lassen Sie uns zur Funktion redirect
gehen und einen Blick darauf werfen.
<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>
Sie können eine sehr kurze Funktion mit zwei serverseitigen Sprungmethoden sehen, mit denen ermittelt wird, ob der http-Header ausgegeben wurde. Es ist ein serverseitiger Sprung.
U
wird nur zum Generieren einer URL verwendet und führt keinen Sprung aus. Die success
-Methode selbst springt nicht, da die Standardvorlage jedoch über springenden javascript
-Code verfügt. Die redirect
-Methode ist ein Sprung, der von der aufgerufenen serverseitigen Funktion ausgeführt wird.
Siehe die offizielle Dokumentation von thinkPHP