搜尋

首頁  >  問答  >  主體

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

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

PHP中文网PHP中文网2895 天前403

全部回覆(4)我來回復

  • 巴扎黑

    巴扎黑2017-04-10 17:30:50

    u助手函数是生成url,不涉及跳转功能。
    success和redirect的区别就是前者在跳转模板上有个笑脸图案,其他没任何区别。
    你可以看看tp的源代码就能找到答案的

    回覆
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-10 17:30:50

    U函数用于生成URL。
    公共的redirect函数用于重定向URL。
    控制器中的redirect方法,也用于重定向URL,可以指定跳转时间,跳转文字。
    控制器中的success方法,和redirect一样,但是有个:)的笑脸。
    控制器中的error方法,和redirect一样,但是有个:(的哭脸

    回覆
    0
  • 巴扎黑

    巴扎黑2017-04-10 17:30:50

    如果这里阅读不方便,请访问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);
        }

    这里可以很明显的看到,successerror都是封装的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 <= 0) {
            location.href = href;
            clearInterval(interval);
        };
    }, 1000);
    })();

    可以看到,是通过javascriptlocation.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 = "<meta http-equiv='Refresh' content='{$time};URL={$url}'>";
            if (0 != $time) {
                $str .= $msg;
            }
    
            exit($str);
        }
    }

    可以看到一个很短的函数,有两种服务端跳转方式,分别用于是否已输出了http头部的情况。是服务端的跳转。

    总结

    U函数只会用来生成一个url,不会执行跳转。
    success方法本身不会跳转,而是因为默认的模板上有跳转的javascript代码。
    redirect方法是调用的服务端函数进行的跳转。

    回覆
    0
  • PHP中文网

    PHP中文网2017-04-10 17:30:50

    看thinkPHP的官方文档

    回覆
    0
  • 取消回覆