私はショップで働いており、カートの場合、支払い前にアイテムを保管する必要があります。
$tempstore = \Drupal::service('user.private_tempstore')->get('boutique');
$tempstore->set('poids', $form_state->getValue('poids'));
私はユーザーサービスを見てみます:
pivate_tempstoreおよびshared_tempstore
ただし、これはユーザーを認証する場合にのみ機能します。
ストアデータには何を使用できますか? $ _SESSION?またはDrupal 8にはそのためのサービスがありますか?
Drupal 8では、セッション変数はリクエストからアクセスできます:
$session = \Drupal::request()->getSession();
セッションで何かを設定したい場合は、以下を実行できます。
$profile = 'Person';
$session->set('profile', $profile);
または、セッション変数を取得するには:
$details = $session->get('profile');
遅い回答ですが、テンポストアがアクティブなセッションにアクセスできる限り、匿名ユーザーに対してプライベートテンポストアを使用できることを言及する価値があります。そのためには、次のように、一時ストア、セッション、および現在のユーザーのサービスをクラスに注入する必要があります。
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();
}
この方法は、ユーザーがログインしているかどうかに関係なく、単一のシステムを一時ストレージに使用できることを意味するため、望ましい方法だと思うかもしれません。
(私のコード例は、多かれ少なかれ逐語的に マルチステップフォームの作成に関するこの優れたチュートリアル から持ち上げられています。)
セッションは匿名にすることができます(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で非常に人気があるようです。しかし、この質問のようにいくつかの値を格納するには複雑すぎます。これは、たとえばプレビューデータや未保存のビューなど、大きなデータのチャンクを対象としています。公式の変更記録は次のとおりです。
最後の更新のため、$this->sessionManager->start();
は機能しなくなりました。 $this->sessionManager->regenerate();
に変更しました