Facebook PHP SDK会话与Yii CWebUser冲突

时间:2011-10-15 05:47:34

标签: facebook session yii facebook-php-sdk

我目前正在使用Yii框架开发一个Facebook画布应用程序,它有多个标签 为应用设置 CWebUser 组件时出现问题 我在user的{​​{1}}方法中设置SiteController组件 设置完之后,我想重定向到我的应用程序中的特定页面选项卡 在重定向的页面中,我想使用用户信息,但用户组件信息丢失 SiteController的代码如下:

actionIndex()

新页面的代码:

<?php
class SiteController extends Controller{
 // other functions

  public function actionIndex(){ 
   // call the Facebook PHP SDK to getUser();
   $fbHelper = new FacebookHelper();
   $userInfo = $fbHelper->getCurrentInfo();
   Yii::app()->user->setId($value['id']);
   Yii::app()->user->setName($value['name']);
   // further i set some more values that are required by the app using setState()
   // query the db to find out what the user was doing last time
   // and then redirect accordingly to the next page
   $this->redirect(array('pagelist/index'));
  }
}

PagelistController的index.php视图中的代码:

<?php
class PagelistController extends Controller{
 public function actionIndex() {
  $this->render('index');
 }
}

很明显,用户信息在重定向中丢失了 现在我收集的是,Facebook的PHP SDK使用会话来存储它的实例,CWebUser组件也是如此。所以我的猜测是FB PHP SDK正在清除重定向会话,这也最终清除了Yii app会话。或接近发生的事情!!
那么我们如何在应用程序的生命周期内保留用户信息呢? 我应该修改FB PHP SDK,以便它使用已生成的yii应用程序会话吗?或者可能阻止它在重定向时清除会话? 感谢任何帮助。
修改:
我使用包含在main.php配置文件中的以下代码的会话作为应用程序组件。但是,如果删除此代码,一切正常,任何想法,为什么这会阻止会话保留?

<?php
 echo "Hi ".Yii::app()->user->name;
 // Yii::app()->user->getIsGuest(); returns true, which shouldn't be the case.

3 个答案:

答案 0 :(得分:1)

我正在使用以下为facebook connect ...

创建的扩展程序

https://github.com/ielshareef/FacebookExtension4Yii

我发现它很有用,直到现在没有问题..即使我已经更新了最新版本的PHP-SDK并根据我的性质做了一些改变..

此扩展使用userIdentity接口将登录facebook的当前设置为默认的CWebUser ...

答案 1 :(得分:1)

尝试使用CWebUser::setState()更新会话而不是Yii :: app() - &gt; user-&gt; setName,例如:

$cwu = new CWebUser();
$cwu->setState('name','newname');

答案 2 :(得分:1)

为避免facebook API会话与Yii会话之间发生冲突,您应编辑文件 facebook.php ,并在构造函数中替换

if ((function_exists('session_status') && session_status() !== PHP_SESSION_ACTIVE) || !session_id()) {
      session_start();
    }

通过

if ((function_exists('session_status') && session_status() !== PHP_SESSION_ACTIVE) || !session_id()) {
  Yii::app()->session->open();
}