การจัดเก็บข้อมูล / เซสชันสำหรับผู้ใช้ที่ไม่ระบุชื่อ


12

ฉันกำลังทำงานในร้านค้าและสำหรับรถเข็นฉันต้องเก็บรายการก่อนชำระเงิน

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

ฉันจะดูที่บริการผู้ใช้สำหรับ:

pivate_tempstore และ shared_tempstore

แต่นั่นใช้งานได้สำหรับผู้ใช้ที่ได้รับสิทธิ์

ฉันจะใช้อะไรกับข้อมูลร้านค้าได้บ้าง $ _SESSION หรือ Drupal 8 มีบริการสำหรับสิ่งนั้น?


ฉันกำลังใช้คุกกี้ ฉันมีตัวระบุและคุกกี้แฮชที่ฉันตรวจสอบแล้วจับคู่ตัวระบุกับสิ่งที่ฉันต้องการ ฉันไม่ได้ใช้เซสชันเพราะ D8 หยุดใช้สำหรับผู้ใช้ที่ไม่ระบุชื่อเช่นกัน

ตกลงและทำไมคุณไม่ใช้ $ _SESSION
เควิน

คำตอบ:


11

ใน Drupal 8 ตัวแปรเซสชันสามารถเข้าถึงได้จากคำขอ:

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

หากคุณต้องการตั้งค่าบางอย่างในเซสชันคุณสามารถทำสิ่งต่อไปนี้:

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

หรือเพื่อดึงตัวแปรเซสชั่น:

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

1
ฉันจะลองดูดังนั้นคุณสามารถจัดเก็บอาร์เรย์ได้หรือไม่
เควิน

1
ใช่คุณสามารถจัดเก็บอาร์เรย์ฉันเปลี่ยนรหัสของฉันเพื่อจัดตำแหน่งกับคำถาม แต่ฉันจริง ๆ แล้วเก็บอาร์เรย์
Duncanmoo

3
พยายามดิ้นรนเพื่อแก้ปัญหาอื่น ๆ ให้ทำงาน - นี่ง่ายมากและดูเหมือนว่าจะใช้งานได้จริง
เนท

วิธีการลบตัวแปรเซสชั่น?
siddiq

ขอบคุณที่ทำงานได้อย่างสมบูรณ์แบบ
Kevin

17

การตอบกลับช้า แต่ก็คุ้มค่าที่จะกล่าวถึงว่าคุณสามารถใช้ tempstore ส่วนตัวสำหรับผู้ใช้ที่ไม่ระบุชื่อตราบใดที่ tempstore สามารถเข้าถึงเซสชันที่ใช้งานอยู่ ในการทำเช่นนั้นคุณต้องฉีดคลาสของคุณด้วยบริการสำหรับที่เก็บ temp เซสชันและผู้ใช้ปัจจุบันเช่น:

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

จากนั้นคุณเพียงแค่ต้องให้แน่ใจว่าคุณเริ่มเซสชันผู้จัดการหากผู้ใช้ไม่ระบุชื่อก่อนที่คุณจะต้องใส่อะไรในเก็บ temp:

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

คุณอาจพบว่าวิธีนี้ดีกว่าเพราะมันหมายความว่าคุณสามารถใช้ระบบเดียวสำหรับการจัดเก็บชั่วคราวโดยไม่คำนึงว่าผู้ใช้เข้าสู่ระบบ

(ตัวอย่างรหัสของฉันถูกยกขึ้นทุกคำหรือมากกว่าจากบทช่วยสอนที่ยอดเยี่ยมนี้ในการสร้างแบบฟอร์มหลายขั้นตอน )


ที่น่าสนใจฉันจะดูมัน แต่ฉันชอบวิธีการนี้
Kevin

ลองดูที่นี้เกี่ยวกับวิธีการที่จะเริ่มต้นเซสชั่นใน Drupal 8 (โพสต์ beta6 บริการ) drupal.org/node/2228871 บางทีเราควรแก้ไขส่วนที่สองของรหัสในคำตอบ
David Riccitelli

ดูเพิ่มเติมที่drupal.stackexchange.com/questions/163142/…
David Riccitelli

3

เซสชั่นสามารถไม่ระบุชื่อ (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 แต่มันซับซ้อนเกินไปที่จะเก็บค่าบางอย่างไว้ในคำถามนี้ มันมีไว้สำหรับกลุ่มข้อมูลขนาดใหญ่เช่นข้อมูลตัวอย่างหรือมุมมองที่ไม่ได้บันทึก นี่คือบันทึกการเปลี่ยนแปลงที่เป็นทางการ:

เข้าถึงข้อมูลเซสชั่นผ่านวัตถุคำขอ

เพิ่ม TempStore API สำหรับการจัดเก็บข้อมูลที่ไม่ใช่แคชที่เก็บข้อมูลแบบต่อเนื่อง


ใช่เซสชันอาจไม่ระบุตัวตน แต่ไม่ใช่สำหรับบริการผู้ใช้
เควิน

ในแนวปฏิบัติที่ดีที่สุดของ Drupal 8 จะบอกว่าคุณควรใช้ Interface เพื่ออ่านและเขียนข้อมูลไปยังตัวแปรเซสชัน สิ่งนี้จะช่วยให้การจัดเก็บแบบถอดเปลี่ยนได้และอนาคตที่สดใส
จอร์จ

1

The $this->sessionManager->start();ไม่ทำงานอีกต่อไปสำหรับฉันเพราะการปรับปรุงล่าสุด ฉันเปลี่ยนมันเป็น$this->sessionManager->regenerate();


คุณควรเพิ่มสิ่งนี้เป็นความคิดเห็นในคำตอบเดิมแทนที่จะเป็นคำตอบใหม่
35711

1
@wranvaud ฉันมีชื่อเสียงไม่เพียงพอที่จะแสดงความคิดเห็นในคำตอบอื่น
Dan Poenaru
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.