CodeIgniter中的执行顺序

时间:2013-02-03 10:42:29

标签: php codeigniter

class Index extends CI_Controller {

 private $data = array();
 private $content_data = array();

 public function __construct() {
    parent::__construct();

    if (isset($_GET['m2w'])) {
        $stw = switch_to_web();
    }

    if (isset($_GET['w2m'])) {
        $stm = switch_to_mobile();
    }

     // load mobile or desktop view

}


 // Called within an helper function 

function switch_to_web() {
  return set_cookie('load-web', 'true', '86500');
 }

function switch_to_mobile() {
  return delete_cookie('load-web');
}

function is_mobile() {

// return true;
$CI = & get_instance();

if ($CI->input->cookie('load-web'))
    return false;

$CI->load->library('user_agent');
if ($CI->agent->is_mobile()) {
    return true;
}else
    return false;
}

我有上面的代码块来确定是否加载移动或Web视图。

预期执行顺序:

  • 如果设置m2w,则设置load-web cookie(这是在调用is_mobile函数之前完成的
  • is_mobile函数看到已设置load-web cookie并加载桌面版

实际执行顺序:

  • 如果设置了m2w,则调用load-web cookie进行设置,但is_mobile功能并未将其视为已设置,因此未加载桌面版本
  • 在is_mobile函数返回true后设置cookie,我检查我的浏览器cookie并观察到cookie实际已设置但未达到预期时间

我不对的是什么?

1 个答案:

答案 0 :(得分:0)

CI的cookie使用PHP的本地setcookie()方法。 Cookie必须先在HTTP标头中发送,然后才能在本机$_COOKIE变量中使用。

来自PHP文档:

  

设置好cookie后,可以使用$ _COOKIE或$ HTTP_COOKIE_VARS数组在下一页加载时访问它们。

以下是CI中的cookie()方法:

function cookie($index = '', $xss_clean = FALSE)
{
    // Simply fetch from the $_COOKIE array and do XSS_Clean if needed.
    return $this->_fetch_from_array($_COOKIE, $index, $xss_clean);
}

简而言之,您正确设置了Cookie,但在您下次请求之前它将无法使用。这都是因为新值不在$_COOKIE数组中。

你有多种方法可以解决这个问题。

  • 您可以扩展CI_Input类并修改set_cookie方法,以便将新值添加到$_COOKIE数组中。
  • 您可以修改is_mobile功能以检查$_GET['m2w']值。 (不仅仅是cookie。)

个性化,我认为第二种解决方案是最干净,最容易做到的,但我不知道你项目的全部范围。

希望这有帮助!