匿名ユーザーのデータ/セッションの保存


12

私は店で働いています、そしてカートのために、私は支払いの前にアイテムを保存する必要があります。

  $tempstore = \Drupal::service('user.private_tempstore')->get('boutique');
  $tempstore->set('poids', $form_state->getValue('poids'));

以下のユーザーサービスを確認します。

pivate_tempstoreおよびshared_tempstore

しかし、それは認証ユーザーに対してのみ機能します。

ストアデータには何を使用できますか?$ _SESSION?またはDrupal 8にはそのためのサービスがありますか?


クッキーを使用しています。識別子とハッシュCookieを検証し、識別子と必要なものをペアにします。D8は匿名ユーザーに対してもセッションの使用を停止したため、セッションは使用しません。

では、なぜ$ _SESSIONを使用しないのですか?
ケビン

回答:


11

Drupal 8では、セッション変数はリクエストからアクセスできます:

$session = \Drupal::request()->getSession();

セッションで何かを設定する場合は、次のことができます。

$profile = 'Person';
$session->set('profile', $profile);

または、セッション変数を取得するには:

$details = $session->get('profile');

1
試してみるので、配列を保存できますか?
ケビン

1
はい、配列を保存できます。質問に合わせてコードを変更しましたが、実際には配列を保存しています。
ダンカンムー

3
これはとても簡単で、実際に動作しているようです-他のソリューションが動作してもらうのに苦労
ネイト

セッション変数を削除するには?
siddiq

その仕事に完全に感謝
ケビン

17

応答が遅くなります、tempstoreがアクティブなセッションにアクセスできる限り、匿名ユーザーにプライベートtempstoreを使用できることに言及する価値があります。そのためには、次のように、一時ストア、セッション、および現在のユーザーのサービスをクラスに注入する必要があります。

public function __construct(PrivateTempStoreFactory $temp_store_factory, SessionManagerInterface $session_manager, AccountInterface $current_user) {
    $this->tempStoreFactory = $temp_store_factory;
    $this->sessionManager = $session_manager;
    $this->currentUser = $current_user;

    $this->store = $this->tempStoreFactory->get('myclass.storename');
}

public static function create(ContainerInterface $container) {
    return new static(
        $container->get('user.private_tempstore'),
        $container->get('session_manager'),
        $container->get('current_user')
    );
}

次に、ユーザーが匿名の場合、一時ストアに何かを置く必要がある前に、セッションマネージャーを起動することを確認する必要があります。

if ($this->currentUser->isAnonymous() && !isset($_SESSION['session_started'])) {
    $_SESSION['session_started'] = true;
    $this->sessionManager->start();
}

このアプローチは、ユーザーがログインしているかどうかに関係なく、一時的なストレージに単一のシステムを使用できることを意味するため、望ましい場合があります。

(私のコード例は、マルチステップフォームの構築に関するこの優れたチュートリアルから多かれ少なかれ逐語的に取り上げられています。)


興味深いことに、私はそれを見ていきますが、私はこのアプローチが好きです
ケビン

Drupal 8(ベータ6以降)drupal.org/node/2228871でセッションを開始する方法については、こちらをご覧ください。おそらく、答えの2番目のコードフラグメントを修正する必要があります。
デヴィッドリッチテッリ


3

セッションは匿名(uid = 0)にすることができます。$ _SESSIONを使用するだけで、drupalがこれを処理します。

セッションデータの保存:

$_SESSION['mymodule']['variablename'] = $tempdata;

セッションデータを取得します。

$tempdata = $_SESSION['mymodule']['variablename'];

更新1:セッションオブジェクト

D8コアでまだ作業が行われていますが、この問題を参照してください$ _SESSIONの使用をリクエストから取得したsymfonyセッションに変換します。リクエストでセッションオブジェクトを使用してセッションデータを保存できます。ただし、これらの方法の1つで保存したデータは、他の方法では使用できません。詳細については、この回答を参照してくださいDrupal 8およびセッション管理

class MymoduleSessionCounter {
  function increment(Request $request) {
    $session = $request->getSession();
    $value = $session->get('mymodule_count', 0);
    $session->set('mymodule_count', $value + 1);

    return $value;
  }
}

更新2:TempStore

TempStoreはD8で非常に人気があるようです。しかし、この質問のように値を保存するには複雑すぎます。これは、プレビューデータや未保存のビューなどの大きなデータの塊を対象としています。公式の変更記録は次のとおりです。

Requestオブジェクトを介してセッションデータにアクセスする

非キャッシュデータの永続的で期限切れのストレージ用に追加されたTempStore API


はい、セッションは匿名にすることができますが、ユーザーサービス用ではないようです。
ケビン

Drupal 8のベストプラクティスでは、インターフェイスを使用してセッション変数へのデータの読み取りと書き込みを行う必要があります。これにより、交換可能なストレージと明るい未来が可能になります。
ジョージ

1

$this->sessionManager->start();なぜなら最後の更新で私のためにもう働いていませんでした。に変更しました$this->sessionManager->regenerate();


これを新しい回答としてではなく、元の回答へのコメントとして追加する必要があります
-wranvaud

1
@wranvaud、私は別の答えにコメントできるほどの評判がありませんでした。
ダンポエナル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.