Lưu trữ dữ liệu / phiên cho người dùng ẩn danh


12

Tôi đang làm việc trên một cửa hàng, và đối với giỏ hàng, tôi cần lưu trữ các mặt hàng trước khi thanh toán.

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

Tôi xem dịch vụ người dùng cho:

pivate_tempstore và shared_tempstore

Nhưng công việc đó chỉ để xác thực người dùng.

Tôi có thể sử dụng gì để lưu trữ dữ liệu? $ _SESSION? hoặc Drupal 8 có một dịch vụ cho điều đó?


Tôi đang sử dụng cookie. Tôi có mã định danh và cookie băm mà tôi xác nhận và sau đó ghép mã định danh với những gì tôi cần. Tôi không sử dụng phiên vì D8 cũng ngừng sử dụng chúng cho người dùng ẩn danh.

Ok và tại sao bạn không sử dụng $ _SESSION?
Kevin

Câu trả lời:


11

Trong Drupal 8, các biến phiên có thể được truy cập ngoài yêu cầu:

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

Nếu bạn muốn thiết lập một cái gì đó trong phiên, bạn có thể làm như sau:

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

Hoặc để truy xuất biến phiên:

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

1
Tôi sẽ thử, vì vậy bạn có thể lưu trữ một mảng?
Kevin

1
Có bạn có thể lưu trữ một mảng, tôi đã thay đổi mã của mình để phù hợp với câu hỏi, nhưng tôi thực sự đang lưu trữ một mảng.
Duncanmoo

3
Đấu tranh để làm cho các giải pháp khác hoạt động - điều này rất đơn giản và dường như thực sự hoạt động
Nate

Làm thế nào để xóa một biến phiên?
siddiq

Cảm ơn công việc đó một cách hoàn hảo
Kevin

17

Trả lời muộn, nhưng điều đáng nói là bạn có thể sử dụng tempstore riêng cho người dùng ẩn danh, miễn là tempstore có quyền truy cập vào một phiên hoạt động. Để làm như vậy, bạn cần cung cấp cho lớp của mình các dịch vụ cho cửa hàng tạm thời, phiên và người dùng hiện tại, như vậy:

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

Sau đó, bạn chỉ cần đảm bảo bạn khởi động trình quản lý phiên nếu người dùng ẩn danh, trước khi bạn cần đặt bất cứ thứ gì vào cửa hàng tạm thời:

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

Bạn có thể thấy cách tiếp cận này thích hợp hơn vì nó có nghĩa là bạn có thể sử dụng một hệ thống duy nhất để lưu trữ tạm thời, bất kể người dùng có đăng nhập hay không.

(Các ví dụ mã của tôi được gỡ bỏ nhiều hơn hoặc ít hơn nguyên văn từ hướng dẫn tuyệt vời này về xây dựng các biểu mẫu nhiều bước .)


Thật thú vị, tôi sẽ xem nó nhưng tôi thích cách tiếp cận này
Kevin

Hãy xem điều này về cách bắt đầu một phiên trong Drupal 8 (bài beta6) drupal.org/node/2228871 . Có lẽ chúng ta nên sửa lại đoạn mã thứ 2 trong câu trả lời.
David Riccitelli


3

Một phiên có thể ẩn danh (uid = 0). Bạn chỉ cần sử dụng $ _SESSION và drupal sẽ đảm nhận việc này.

Lưu trữ dữ liệu phiên:

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

Nhận dữ liệu phiên:

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

Cập nhật 1: Đối tượng phiên

Mặc dù vẫn có công việc đang diễn ra trong lõi D8, hãy xem vấn đề này Chuyển đổi sử dụng $ _SESSION sang phiên symfony lấy từ yêu cầu , bạn có thể sử dụng đối tượng phiên trong yêu cầu để lưu trữ dữ liệu phiên. Nhưng đừng trộn nó, dữ liệu bạn lưu trữ với một trong những phương pháp này không có sẵn trong các phương pháp khác. Xem câu trả lời này để biết thêm chi tiết Drupal 8 và Quản lý phiên :

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

    return $value;
  }
}

Cập nhật 2: TempStore

TempStore dường như rất phổ biến trong D8. Nhưng nó quá phức tạp để lưu trữ một số giá trị như trong câu hỏi này. Nó được dành cho các khối dữ liệu lớn như dữ liệu xem trước hoặc Chế độ xem chưa được lưu. Dưới đây là hồ sơ thay đổi chính thức:

Truy cập dữ liệu phiên thông qua đối tượng Yêu cầu

API TempStore được thêm vào để lưu trữ dữ liệu không lưu trữ liên tục, có thể hết hạn


có phiên có thể ẩn danh nhưng không phải cho dịch vụ người dùng rõ ràng.
Kevin

Trong Drupal 8 cách thực hành tốt nhất sẽ ra lệnh rằng bạn nên sử dụng Giao diện để đọc và ghi dữ liệu vào các biến phiên. Điều này cho phép lưu trữ có thể trao đổi và một tương lai tươi sáng hơn.
George

1

Việc $this->sessionManager->start();này không còn hiệu quả với tôi nữa vì bản cập nhật cuối cùng. Tôi đã đổi nó thành$this->sessionManager->regenerate();


Bạn nên thêm nhận xét này dưới dạng nhận xét cho câu trả lời ban đầu thay vì trả lời mới
wranvaud

1
@wranvaud, tôi không đủ danh tiếng để có thể bình luận về câu trả lời khác.
Dan Poenaru
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.