web-dev-qa-db-ja.com

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

私はショップで働いており、カートの場合、支払い前にアイテムを保管する必要があります。

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

私はユーザーサービスを見てみます:

pivate_tempstoreおよびshared_tempstore

ただし、これはユーザーを認証する場合にのみ機能します。

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

13
Kevin

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

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

セッションで何かを設定したい場合は、以下を実行できます。

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

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

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

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

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();
}

この方法は、ユーザーがログインしているかどうかに関係なく、単一のシステムを一時ストレージに使用できることを意味するため、望ましい方法だと思うかもしれません。

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

18
lyserge

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

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

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

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

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

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

D8コアではまだ作業が進行中ですが、この問題を参照してください $ _ SESSIONの使用をリクエストから取得したsymfonyセッションに変換 、セッションオブジェクトをリクエストで使用してセッションデータを保存できます。ただし、混在させないでください。これらの方法のいずれかで保存したデータは、他の方法では使用できません。詳細については、この回答を参照してください 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

3
4k4

最後の更新のため、$this->sessionManager->start();は機能しなくなりました。 $this->sessionManager->regenerate();に変更しました

1
Dan Poenaru