Menyimpan data / sesi untuk pengguna anonim

12

Saya bekerja di toko, dan untuk kereta, saya harus menyimpan barang sebelum pembayaran.

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

Saya melihat pada layanan pengguna untuk:

pivate_tempstore dan shared_tempstore

Tetapi itu hanya berfungsi untuk pengguna yang diautentikasi.

Apa yang bisa saya gunakan untuk menyimpan data? $ _SESSION? atau Drupal 8 punya layanan untuk itu?

Kevin
sumber
Saya menggunakan cookie. Saya memiliki cookie pengidentifikasi dan hash yang saya validasi lalu memasangkan pengidentifikasi dengan apa yang saya butuhkan. Saya tidak menggunakan sesi karena D8 juga berhenti menggunakannya untuk pengguna anonim.
Oke dan mengapa Anda tidak menggunakan $ _SESSION?
Kevin

Jawaban:

11

Dalam Drupal 8 variabel sesi dapat diakses dari permintaan:

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

Jika Anda ingin mengatur sesuatu di sesi, Anda dapat melakukan hal berikut:

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

Atau untuk mengambil variabel sesi:

$details = $session->get('profile');
Duncanmoo
sumber
1
saya akan mencobanya, sehingga Anda dapat menyimpan array?
Kevin
1
Ya, Anda dapat menyimpan array, saya mengubah kode saya untuk menyelaraskan dengan pertanyaan, tetapi saya sebenarnya menyimpan sebuah array.
Duncanmoo
3
Berjuang untuk mendapatkan solusi lain yang berfungsi - ini sangat sederhana dan tampaknya benar-benar berfungsi
Nate
bagaimana cara menghapus variabel sesi?
siddiq
Terima kasih itu bekerja dengan sempurna
Kevin
17

Terlambat menjawab, tetapi perlu disebutkan bahwa Anda dapat menggunakan tempstore pribadi untuk pengguna anonim, selama tempstore memiliki akses ke sesi aktif. Untuk melakukannya, Anda perlu menyuntikkan kelas Anda dengan layanan untuk temp store, sesi, dan pengguna saat ini, seperti:

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

Maka Anda hanya perlu memastikan Anda memulai manajer sesi jika pengguna anonim, sebelum Anda perlu memasukkan apa pun di temp store:

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

Anda mungkin menemukan pendekatan ini lebih disukai karena itu berarti Anda dapat menggunakan sistem tunggal untuk penyimpanan sementara, terlepas dari apakah pengguna masuk atau tidak.

(Contoh kode saya terangkat lebih atau kurang kata demi kata dari tutorial yang sangat baik tentang membangun formulir multi-langkah ini .)

lyserge
sumber
Menarik, saya akan memeriksanya tetapi saya suka pendekatan ini
Kevin
Lihatlah ini tentang cara memulai sesi di Drupal 8 (post beta6) drupal.org/node/2228871 . Mungkin kita harus merevisi fragmen kode ke-2 dalam jawabannya.
David Riccitelli
Lihat juga drupal.stackexchange.com/questions/163142/…
David Riccitelli
3

Sesi bisa anonim (uid = 0). Anda cukup menggunakan $ _SESSION dan drupal akan membereskan ini.

Simpan data sesi:

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

Dapatkan data sesi:

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

Pembaruan 1: Objek Sesi

Sementara masih ada pekerjaan yang terjadi di inti D8, lihat masalah ini Mengonversi penggunaan $ _SESSION ke sesi symfony yang diambil dari permintaan , Anda dapat menggunakan objek sesi dalam permintaan untuk menyimpan data sesi. Tapi jangan campur, data yang Anda simpan dengan salah satu metode ini tidak tersedia di yang lain. Lihat jawaban ini untuk lebih jelasnya Drupal 8 dan Manajemen Sesi :

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

    return $value;
  }
}

Pembaruan 2: TempStore

TempStore tampaknya sangat populer di D8. Tetapi terlalu rumit untuk menyimpan beberapa nilai seperti dalam pertanyaan ini. Ini dimaksudkan untuk potongan besar data seperti misalnya data pratinjau atau Tampilan yang tidak disimpan. Berikut adalah catatan perubahan resmi:

Akses data sesi melalui objek Permintaan

API TempStore ditambahkan untuk penyimpanan data non-cache yang terus-menerus dan tidak terputus

4k4
sumber
sesi ya bisa anonim tetapi tidak untuk layanan pengguna rupanya.
Kevin
Dalam Drupal 8 praktik terbaik akan menentukan bahwa Anda harus menggunakan Antarmuka untuk membaca dan menulis data ke variabel sesi. Ini memungkinkan penyimpanan yang swappable dan masa depan yang lebih cerah.
George
1

Itu $this->sessionManager->start();tidak berfungsi lagi untuk saya karena pembaruan terakhir. Saya mengubahnya menjadi$this->sessionManager->regenerate();

Dan Poenaru
sumber
Anda harus menambahkan ini sebagai komentar pada jawaban asli dan bukan sebagai jawaban baru
wranvaud
1
@wranvaud, saya tidak punya cukup reputasi untuk bisa mengomentari jawaban lain.
Dan Poenaru