CodeIgniter - 在CI会话中存储类实例

时间:2014-04-09 18:47:36

标签: php facebook codeigniter session serialization

最近,我一直想在我的CodeIgniter项目中实现Facebook SDK for PHP。 Facebook sdk可能是懒散的,这就是为什么我要存储一个包含聚集的fb& fb用户会话中的用户详细信息。

当我存储类实例时,只要我不刷新或重定向,我就可以在以后使用它。 当我重定向时,该值未设置...

我已经阅读了有关使用序列化和反序列化(针对全局PHP会话)的信息,但在这种情况下它并没有帮助。

这是fb类:

class FBClass {
    protected $FB = false;
    protected $FBUser = false;
    protected $FBUserProfile = false;
    protected $FBUserEmail = false;

    protected $loggedIn = false;

    protected $config = array(
        'appId' => '007',
        'secret' => '911',
        'cookie' => true,
        'fileUpload' => false,
        'allowSignedRequest' => false
    );

    protected $params = array(
        'client_id' => '007',
        'scope' => 'email'
    );

    function __construct() {
        if (!$this->FB) {
            $this->FB = new Facebook($this->config);
        }
    }

    public function isLoggedIn() {
        return $this->loggedIn;
    }

    public function getLoginUrl() {
        $this->FB->getLoginUrl($this->params); 
    }

    public function getUser() {
        if (!$this->FBUser) {
            $this->FBUser = $this->FB->getUser();
        }
        return $this->FBUser;
    }

    public function getUserProfile() {
        if (!$this->FBUserProfile) {
            $this->FBUserProfile = $this->FB->api('/me','GET');
        }
        if ($this->FBUserProfile && !$this->FBUserEmail) {
            $emailArray = $this->FB->api('/me?fields=email');
            $this->FBUserEmail = array_key_exists('email', $emailArray) ? $emailArray['email'] : 'Onbekend';
            $this->loggedIn = true;
        }
        return $this->FBUserProfile;
    }

    public function getUserFullName() {
        return $this->FBUserProfile['name'];
    }

    public function getUserAlias() {
        return $this->FBUserProfile['username'];
    }

    public function getUserEmail() {
        return $this->FBUserEmail;
    }

    public function getUserFirstName() {
        return $this->FBUserProfile['first_name'];
    }

    public function getUserLastName() {
        return $this->FBUserProfile['last_name'];
    }

    public function getUserId() {
        return $this->FBUserProfile['id'];
    }
}

在我的控制器中,我存储或检索我的FBClass实例:

public function checkFacebookState() {
    if (!$this->session->userdata('fb')) {
        $fbSes = new FBClass();
        $this->session->set_userdata('fb', serialize($fbSes));
    } else {
        $fbSes = unserialize($this->session->userdata('fb'));
    }
}

在会话中存储字符串确实有效。 我知道PHP不是OO,这就是为什么我要寻找一个简单的替代方案。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

为了将您的实例保存在会话中,无论您是首先序列化它还是没有问题。 以下面的例子为例。 在您的应用程序/库文件夹中创建一个库测试:

class Test {
    public $testProp;
    public function __construct() {
        $this->testProp = 'testing'; 
    }
}

然后在你的控制器中写下以下内容:

class Welcome extends CI_Controller {


    public function index()
    {
            $this->load->library('test');
            $this->session->set_userdata('someIns',  $this->test);
        $this->load->view('welcome_message');
    }
}

最后在你看来:

<div id="container">
    <?php 
        echo '<pre>';
        var_dump($x = $this->session->userdata('someIns'));
        echo '</pre>';
        echo '<pre>';
        echo $x->testProp;
        echo '</pre>';
        echo '<pre>';
        var_dump($this->session->all_userdata());
        echo '</pre>';
        ?>
</div>
输出将是:

object(Test)#15 (1) {
  ["testProp"]=>
  string(7) "testing"
}
testing
array(6) {
  //some session data
  ["user_data"]=>
  string(0) ""
  ["someIns"]=>
  object(Test)#15 (1) {
    ["testProp"]=>
    string(7) "testing"
  }
}

如果您注意到我从会话中获取echo $x->testProp之后直接使用了class Welcome extends CI_Controller { public function index() { $this->load->library('test'); $this->session->set_userdata('someIns', serialize($this->test)); $this->load->view('welcome_message'); } } 。 这里不需要序列化。

序列化:

控制器:

    <div id="container">
        <?php 
            echo '<pre>';
            var_dump($x = $this->session->userdata('someIns'));
            echo '</pre>';
            echo '<pre>';
            $y = unserialize($x);
            echo $y->testProp;
            echo '</pre>';
            echo '<pre>';
            var_dump($this->session->all_userdata());
            echo '</pre>';
            ?>
    </div>

查看:

string(44) "O:4:"Test":1:{s:8:"testProp";s:7:"testing";}"
testing
array(6) {
  //some session data
  ["user_data"]=>
  string(0) ""
  ["someIns"]=>
  string(44) "O:4:"Test":1:{s:8:"testProp";s:7:"testing";}"
}

结果:

testing

单词$this->load->library('test'); $this->session->set_userdata('someIns', $this->test); 仍然被回应。

现在你的问题显然是你正在以错误的方式获得FB课程, 这是一个图书馆。因此,您需要首先加载库,就像我在上面的示例中所做的那样,

$this->test

或序列化之后。 Test这里是库文件夹中{{1}}类的一个实例。