CodeIgniter 中的执行顺序


Order of execution in 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功能看到加载网络cookie已设置并加载桌面版本

实际执行顺序:

  • 如果设置了 M2W,则调用加载网络 cookie 进行设置,但是is_mobile函数不会将其视为已设置,因此不会加载桌面版本
  • Cookie 是在 is_mobile 函数返回 true 后设置的,我检查了我的浏览器 cookie 并观察到 cookie 实际上已设置,但未达到预期

我有什么不对的?

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']值。(不仅仅是饼干。

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

希望这有帮助!