web-dev-qa-db-ja.com

セッションを強制的に開始する正しい方法は何ですか?

私は現在、SimpleFBConnectモジュールをDrupal 8.に移植しています。このモジュールはFacebookを使用しますPHP SDKは、ユーザーがFacebookにリダイレクトされる前にセッションを確立することを期待しています認証用。

SessionManager APIを読むことにより、SessionManager :: startがセッションを開始すると想定しました。しかし、これはそうではないようです。同じことがSessionManager :: saveにも当てはまります(説明では、この関数は「セッションを強制的に保存して閉じる」と述べています)。

セッションを強制的に開始する唯一の方法は、SessionManager::regenerateを呼び出すことでした。

これはDrupal 8でセッションを強制的に開始する正しい方法ですか?

SessionManager :: startがセッションを開始しないことを示すデバッグコード。

class TestController extends ControllerBase {
  public function test() {
    $session_manager = Drupal::service('session_manager');
    $session_manager->start();

    if ($session_manager->isStarted()) {
      $msg = 'Sesssion started';
    }
    else {
      $msg = 'Sesssion not started';
    }

    return array(
      '#markup' => $msg
    );
  }
}
6
Markus Sipilä

Drupalは、リクエストの最後に$_SESSIONスーパーグローバルにはデータが含まれます。空のセッションは積極的に破棄されます。これは、リバースプロキシサーバー(ワニスなど)の背後にあるサイトを操作するときに、キャッシュヒット率を最大化するためです。

@Berdirですでに指摘されているように、Drupalでセッション開始をトリガーする適切な方法は、何かを保存することです。ただし、Facebook SDKは、不適切なセッション管理。ソースコードによると、この機能はメソッド FacebookRedirectLoginHelper :: disableSessionStatusCheck() を使用して無効にできます。セッションの開始を強制するのではなく、それを使用してください。

2
znerol

さて、この変更レコードから回答を見つけました: https://www.drupal.org/node/2228871

セッションは次のように強制的に開始できます。

// Force session start if we don't already have a session.
$session = \Drupal::service('session');
if (!$session->isStarted()) {
  $session->migrate();
}
5
Markus Sipilä

セッションを強制する唯一の方法は、その中に何かを保存することだと思います。

Drupalはセッションデータのないセッションを保存しないので、AFAIKなので、手動で開始しても意味がありません。

そのため、$ _ SESSIONにダミーキーを配置してみてください。

1
Berdir