【问题标题】:How to pass Model objects in CodeIgniter session from controller to controller?如何将 CodeIgniter 会话中的模型对象从控制器传递到控制器?
【发布时间】:2012-07-20 03:00:27
【问题描述】:

我对 CI 相当陌生,我正在使用它完成一个项目。

我正在使用 CI 2.1.2 DataMapper 1.8.2.1。

我正在尝试将登录表单发布到http://www.example.com/userauthcontroller/login 我能够点击该功能并按应有的方式进行身份验证。主要是使用DataMapper的例子和代码。

Userauthcontroller.php:

public function login(){
    $params = $this->input->post();
    $url = $params['url'];
    $loginId = $params['loginid'];
    $password = $params['loginpass'];
    $u = new User();
    $u->username = $loginId;
    $u->pass_word =$password;
    if($u->login()){
        $confirmedUser = $u->get_where(array('id' => $u->id));
        $CI =& get_instance();
        $CI->session->set_userdata(array('currentuser' => $confirmedUser));
        //print_r($CI->session->userdata('currentuser'); // works
        //die();
        //tried this too
        //$this->session->set_userdata(array('currentuser' => $confirmedUser));
        redirect($url);
    }else{
        echo '<p>' . $u->error->login . '</p>';
    }
}

当我重定向到欢迎控制器时,我在会话中找不到当前用户。

欢迎.php:

function index(){
    $data['site_title'] = "My Site Title";
    $data['view_file'] = "layout_views/home_view";

    $CI =& get_instance();
    $user = $CI->session->userdata('currentuser');

    $data['currentuser'] = $user;
    print_r($user);
    print("<BR/>");
    print_r($data);
    die();
    //If I let this continue into my view $currentuser is not available.
    $this->load->view('index_view', $data);
}

home_view.php:

<p><? echo $currentuser ?></p> <!-- this does not print -->
<p><? echo $site_title ?></p>  <!-- this prints -->

application/config/autoload.php:(我知道的相关条目)

$autoload['libraries'] = array('database', 'datamapper', 'session');
$autoload['packages'] = array(APPPATH.'third_party/datamapper');

我对此进行了一些搜索……甚至检查了拼写错误。

任何建议将不胜感激。

如果需要更多信息,我会经常回来查看。

谢谢

【问题讨论】:

  • $CI-&gt;session-&gt;set_userdata('id', $u-&gt;id)$CI-&gt;session-&gt;userdata('id') 工作吗?
  • 看来我可以在会话中传递 id。有什么东西阻止我传递模型对象吗?

标签: php model-view-controller codeigniter codeigniter-2 codeigniter-datamapper


【解决方案1】:

感谢Yan,它让我朝着正确的方向前进。我不知道这是否是最好的方法,但它确实有效。

userauthcontroller.php:

public function login(){
    $params = $this->input->post();
    $url = $params['url'];
    $loginId = $params['loginid'];
    $password = $params['loginpass'];
    $u = new User();
    $u->username = $loginId;
    $u->pass_word =$password;
    if($u->login()){
        $confirmedUser = new User(array('id' => $u->id));
        $CI =& get_instance();
        $CI->session->set_userdata(array('currentuser_id' => $u->id));
        $CI->session->set_userdata(array('currentuser' => $confirmedUser));
        redirect($url);
    }else{
        echo '<p>' . $u->error->login . '</p>';
    }
}

欢迎.php:

    function index(){
    $data['site_title'] = "PrimitiveSurvival.com";
    $data['view_file'] = "layout_views/home_view";
    $CI =& get_instance();
    $u = new User($CI->session->userdata('currentuser_id'));
    if($u->id != null){
        $u->group->get_iterated();
        $data['currentuser'] = $u;
    }else{
        $data['currentuser'] = "";
    }
    $this->load->view('index_view', $data);
}

home_view.php:

 <?php
  if($currentuser != ""){
     print($currentuser->username);
  }else{
     print("User not logged in.");
  }

如果有更好的方法或我缺少的东西,请务必改进此答案。 ?>

【讨论】:

  • 你的方法看起来不错。如果不使用,为什么在会话中设置currentuser?您是否尝试使用$this 而不是 CI?在 controllers\models 中,不需要先获取实例。如果您分别扩展 CI_Controller 和 CI_Model,它会自动加载。
  • 我对 CI 还很陌生……这些代码只是为了确保我可以获得所需的信息。我正在进行的项目将在整个应用程序中从 currentuser 对象获取用户权限和组。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多