Anonim kullanıcı için veri / oturum saklama


13

Bir dükkanda çalışıyorum ve araba için ödeme yapmadan önce eşyaları saklamam gerekiyor.

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

Aşağıdakiler için kullanıcı hizmetine bir göz atıyorum:

pivate_tempstore ve shared_tempstore

Ancak bu yalnızca kullanıcıların kimliğini doğrular.

Mağaza verileri için ne kullanabilirim? $ _SESSION? veya Drupal 8'in bunun için bir servisi var mı?


Çerez kullanıyorum. Ben doğrulamak ve sonra tanımlayıcı ne gerek eşleştirmek tanımlayıcı ve karma çerez var. Oturumları kullanmıyorum çünkü D8 onları anonim kullanıcılar için kullanmayı bıraktı.

Tamam ve neden $ _SESSION kullanmıyorsunuz?
Kevin

Yanıtlar:


11

Drupal 8'de oturum değişkenlerine isteğe bağlı olarak erişilebilir:

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

Oturumda bir şey ayarlamak istiyorsanız, aşağıdakileri yapabilirsiniz:

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

Veya bir oturum değişkenini almak için:

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

1
ben bir deneyin, böylece bir dizi saklamak?
Kevin

1
Evet bir dizi saklayabilirsiniz, ben soruyla hizalamak için kodumu değiştirdim, ama benim aslında bir dizi saklıyor.
Duncanmoo

3
Diğer çözümlerin çalışmasını sağlamak için mücadele etti - bu çok basit ve gerçekten işe yarıyor gibi görünüyor
Nate

bir oturum değişkeni nasıl silinir?
siddiq

Bu işe mükemmel bir şekilde teşekkür ederim
Kevin

18

Geç cevap ama onun değer, eğer söz edebilir sürece tempstore aktif oturuma erişimi nedeniyle, anonim kullanıcılar için özel tempstore kullanın. Bunu yapmak için, sınıfınıza geçici depo, oturum ve geçerli kullanıcı için aşağıdaki gibi hizmetler vermeniz gerekir:

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

Ardından, kullanıcı anonim ise, geçici depoya herhangi bir şey koymadan önce oturum yöneticisini başlattığınızdan emin olmanız gerekir:

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

Bir kullanıcının oturum açmış olup olmamasına bakılmaksızın, geçici depolama için tek bir sistem kullanabileceğiniz anlamına geldiği için bu yaklaşımı tercih edebilirsiniz.

(Kod örneklerim, çok adımlı formlar oluşturma hakkındaki bu mükemmel öğreticiden az çok kelimeyle kaldırıldı .)


İlginç, ben bir göz atacağım ama bu yaklaşımı seviyorum
Kevin

Drupal 8'de (beta6 sonrası) drupal.org/node/2228871'de nasıl oturum başlatacağınıza bir göz atın . Belki cevaptaki 2. kod parçasını gözden geçirmeliyiz.
David Riccitelli


3

Bir oturum anonim olabilir (uid = 0). Sadece $ _SESSION kullanabilirsiniz ve drupal bununla ilgilenecektir.

Oturum verilerini depola:

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

Oturum verilerini alın:

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

Güncelleme 1: Oturum Nesnesi

D8 çekirdeğinde hala çalışmalar devam ederken, bu konuya bakın . $ _SESSION kullanımını istekten alınan symfony oturumuna dönüştürün, istekte oturum nesnesini oturum verilerini depolamak için kullanabilirsiniz. Ancak karıştırmayın, bu yöntemlerden biriyle depoladığınız veriler diğerinde mevcut değildir. Daha fazla bilgi için bu cevaba bakınız Drupal 8 ve Oturum Yönetimi :

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

    return $value;
  }
}

Güncelleme 2: TempStore

TempStore, D8'de çok popüler görünüyor. Ancak bu sorudaki gibi bazı değerleri saklamak çok karmaşık. Önizleme verileri veya kaydedilmemiş Görünümler gibi büyük veri parçaları için tasarlanmıştır. İşte resmi değişiklik kayıtları:

İstek nesnesiyle oturum verilerine erişme

Önbellek dışı verilerin kalıcı ve süresi dolmak üzere depolanması için TempStore API'sı eklendi


evet oturum anonim olabilir ama görünüşe göre kullanıcı hizmeti için değil.
Kevin

Drupal 8'de en iyi uygulama, oturum değişkenlerine veri okumak ve yazmak için bir Arabirim kullanmanız gerektiğini belirtir. Bu, değiştirilebilir depolamaya ve daha parlak bir geleceğe olanak tanır.
George

1

$this->sessionManager->start();Çünkü son güncelleme benim için artık çalışmıyordu. Olarak değiştirdim$this->sessionManager->regenerate();


Bunu yeni bir cevaptan ziyade orijinal cevaba bir yorum olarak eklemelisiniz
wranvaud

1
@wranvaud, başka bir cevap hakkında yorum yapabilmek için yeterli üne sahip değildim.
Dan Poenaru
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.