Solución:
En D8, los datos de la sesión los proporciona un objeto de sesión de Symfony, que se adjunta a la solicitud. Vea esta comparación de D7 contra D8:
Drupal 7:
function mymodule_session_counter_increment() {
if (!isset($_SESSION['mymodule_count'])) {
$_SESSION['mymodule_count'] = 0;
}
return $_SESSION['mymodule_count']++;
}
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;
}
}
Cambiar registro: acceder a los datos de la sesión a través del objeto Solicitud
La gestión de sesiones no ha cambiado. No necesita hacer nada, porque Drupal inicia una sesión para cada solicitud automáticamente y puede usarla de inmediato.
Ejemplos de cómo obtener la sesión:
Procesal
En el código de procedimiento, obtenga la solicitud del contenedor estático Drupal
:
$request = Drupal::request();
$session = $request->getSession();
$session->set('mymodule_value', $value);
Controlador
En un controlador, puede extraer la solicitud de la pila de argumentos de ruta al incluir un parámetro de solicitud escrito. Un ejemplo de UserController
:
public function resetPass(Request $request, $uid, $timestamp, $hash) {
...
$session = $request->getSession();
$session->set('pass_reset_hash', $hash);
$session->set('pass_reset_timeout', $timestamp);
...
}
No es necesario definir el parámetro de ruta en la definición de ruta. La solicitud está siempre disponible.
Formulario
En un método de formulario, obtenga la solicitud de getRequest()
:
public function submitForm(array &$form, FormStateInterface $form_state) {
$session = $this->getRequest()->getSession();
$session->set('mymodule_form_value', $form_state->getValue('value'));
}
Tienda privada
El almacén temporal privado no reemplaza las sesiones. Depende del ID de la sesión y no es posible usarlo sin una sesión. Por lo tanto, también puede almacenar los valores directamente en la sesión. El núcleo de Drupal utiliza el almacén temporal privado para una gran cantidad de datos y solo para usuarios autenticados que ya tienen una sesión. Para los usuarios anónimos no es fácil iniciar una tienda temporal privada, porque drupal usa identificadores de sesión ficticios hasta que inicia una sesión real. Si inicia una tienda temporal privada en código personalizado, tiene la identificación de sesión incorrecta.
Drupal 8 usa HttpFoundation Session Management de Symfony, así que ahí es donde se documenta la API.
Si miras en core.services.yml
puede encontrar que el contenedor de Drupal está en formato.
session_manager:
class: DrupalCoreSessionSessionManager
Aquí hay un artículo sobre cómo usar el servicio apropiado para almacenar datos en la sesión: http://atendesigngroup.com/blog/storing-session-data-drupal-8
Hay dos métodos descritos en el artículo, aquí está el primero que no usa la inyección de dependencia. (el código no es mío)
Para configurar datos temporales:
// For "mymodule_name," any unique namespace will do.
// I'd probably use "mymodule_name" most of the time.
$tempstore = Drupal::service('user.private_tempstore')->get('mymodule_name');
$tempstore->set('my_variable_name', $some_data);
Para leer datos temporales:
$tempstore = Drupal::service('user.private_tempstore')->get('mymodule_name');
$some_data = $tempstore->get('my_variable_name');