Almacenamiento de datos / sesión para usuario anónimo

12

Estoy trabajando en una tienda, y para el carrito, necesito almacenar artículos antes del pago.

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

Echo un vistazo al servicio de usuario para:

pivate_tempstore y shared_tempstore

Pero eso solo funciona para usuarios autenticados.

¿Qué puedo usar para almacenar datos? $ _SESION? o Drupal 8 tiene un servicio para eso?

Kevin
fuente
Estoy usando cookies Tengo un identificador y una cookie hash que valido y luego emparejo el identificador con lo que necesito. No uso sesiones porque D8 también dejó de usarlas para usuarios anónimos.
Ok y ¿por qué no usas $ _SESSION?
Kevin

Respuestas:

11

En Drupal 8 se puede acceder a las variables de sesión desde la solicitud:

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

Si desea configurar algo en la sesión, puede hacer lo siguiente:

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

O para recuperar una variable de sesión:

$details = $session->get('profile');
Duncanmoo
fuente
1
¿Lo intentaré para que pueda almacenar una matriz?
Kevin
1
Sí, puede almacenar una matriz, cambié mi código para alinearlo con la pregunta, pero la mía en realidad está almacenando una matriz.
Duncanmoo
3
Luchó para que otras soluciones funcionen, esto es muy simple y parece que realmente funciona
Nate
¿Cómo borrar una variable de sesión?
siddiq
Gracias que funcionan perfectamente
Kevin
17

Respuesta tardía, pero vale la pena mencionar que puede usar tempstore privado para usuarios anónimos, siempre que tempstore tenga acceso a una sesión activa. Para hacerlo, debe inyectar a su clase servicios para la tienda temporal, la sesión y el usuario actual, de esta manera:

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

Luego, solo debe asegurarse de iniciar el administrador de sesión si el usuario es anónimo, antes de poner algo en el almacén temporal:

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

Es posible que este enfoque sea preferible porque significa que puede usar un solo sistema para el almacenamiento temporal, independientemente de si un usuario ha iniciado sesión.

(Mis ejemplos de código se extraen más o menos textualmente de este excelente tutorial sobre cómo crear formularios de varios pasos ).

liserge
fuente
Interesante, lo echaré un vistazo, pero me gusta este enfoque
Kevin
Eche un vistazo a esto sobre cómo iniciar una sesión en Drupal 8 (post beta6) drupal.org/node/2228871 . Tal vez deberíamos revisar el segundo fragmento de código en la respuesta.
David Riccitelli
Ver también drupal.stackexchange.com/questions/163142/…
David Riccitelli
3

Una sesión puede ser anónima (uid = 0). Simplemente puede usar $ _SESSION y drupal se encargará de esto.

Almacenar datos de sesión:

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

Obtener datos de sesión:

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

Actualización 1: Objeto de sesión

Si bien todavía hay trabajo en el núcleo de D8, vea este problema Convierta los usos de $ _SESSION a la sesión de Symfony recuperada de la solicitud , puede usar el objeto de sesión en la solicitud para almacenar los datos de la sesión. Pero no lo mezcle, los datos que almacena con uno de estos métodos no están disponibles en el otro. Consulte esta respuesta para obtener más detalles sobre Drupal 8 y la gestión de sesiones :

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

    return $value;
  }
}

Actualización 2: TempStore

El TempStore parece ser muy popular en D8. Pero es demasiado complicado almacenar algunos valores como en esta pregunta. Está destinado a grandes fragmentos de datos, como por ejemplo datos de vista previa o vistas no guardadas. Aquí están los registros de cambios oficiales:

Acceda a los datos de la sesión a través del objeto Solicitud

Se agregó la API TempStore para el almacenamiento persistente y expirable de datos que no son de caché

4k4
fuente
Sí, la sesión puede ser anónima, pero aparentemente no para el servicio de usuario.
Kevin
En Drupal 8, las mejores prácticas dictarían que debe usar una interfaz para leer y escribir datos en las variables de sesión. Esto permite un almacenamiento intercambiable y un futuro más brillante.
George
1

El $this->sessionManager->start();ya no funcionaba para mí, porque de su última actualización. Lo cambié a$this->sessionManager->regenerate();

Dan Poenaru
fuente
Debe agregar esto como un comentario a la respuesta original en lugar de como una nueva respuesta
wranvaud
1
@wranvaud, no tenía suficiente reputación para poder comentar otra respuesta.
Dan Poenaru