Конфликт сессии PHP PHP SDK с Yii CWebUser - PullRequest
1 голос
/ 15 октября 2011

В настоящее время я занимаюсь разработкой приложения для холста Facebook, в котором есть несколько вкладок с использованием инфраструктуры Yii.И есть проблема в установке компонента CWebUser для приложения.Я устанавливаю компонент user в методе SiteController actionIndex().После установки этого я хочу перенаправить на определенную вкладку страницы в моем приложении.На перенаправленной странице я хочу использовать информацию о пользователе, но информация о компоненте пользователя потеряна.Код для SiteController ниже:

<?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'));
  }
}

Код для новой страницы:

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

Код в представлении index.php для PagelistController:

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

Таким образом, очевидно, что пользовательская информация теряется при перенаправлении.Теперь я понял, что PHP SDK Facebook использует сессии для хранения своего экземпляра, как и компонент CWebUser.Поэтому я предполагаю, что FB PHP SDK очищает сеанс от перенаправлений, что также приводит к очистке сеанса приложения Yii.Или что-то близкое к тому, что происходит !!Итак, как же нам сохранить информацию о пользователе при жизни приложения?Должен ли я изменить FB PHP SDK, чтобы он использовал уже сгенерированный сеанс приложения yii?Или, может быть, помешать очистке сессии на перенаправлениях?Ценю любую помощь. Редактировать: Я использовал сеансы с кодом ниже, включенным в файл конфигурации main.php, в качестве компонента приложения.Однако, если этот код удален, все работает нормально, есть идеи, почему это предотвращает сохранение сессии?

'session'=>array(
        'sessionName'=>'PageType',
        'autoStart'=>true,
        'cookieMode'=>allow,
        'class' => 'system.web.CDbHttpSession',
        'connectionID' => 'db',
        'sessionTableName' => 'tbl_session',
    ),

Ответы [ 3 ]

1 голос
/ 15 октября 2011

Попробуйте использовать CWebUser :: setState () для обновления сеанса вместо Yii :: app () -> user-> setName, например ::

$cwu = new CWebUser();
$cwu->setState('name','newname');
1 голос
/ 27 октября 2015

Чтобы избежать конфликта между сеансом API Facebook и сеансом 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();
}
1 голос
/ 15 октября 2011

Я использую следующее расширение, которое создано для подключения Facebook ...

https://github.com/ielshareef/FacebookExtension4Yii

Я нашел это полезным, и до сих пор проблем нет .. Даже я обновил последнюю версию PHP-SDK и внес некоторые изменения в соответствии с моей природой.

Это расширение использует интерфейс userIdentity для установки текущего зарегистрированного в Facebook CWebUser по умолчанию ...

...