Come gestire con Symfony le variabili di sessione.

Cos’è una PHP Session?

La variabile di sessione di PHP ci permette di salvare temporaneamente le informazioni di navigazione (es: username, color etc…) all’interno del server.
La variabile sarà cancellata alla chiusura del browser.

1. pagina uno che setta le variabili


<?php
// 1. inizializzo la sessione
session_start();

// 2. con la variabile globale $_SESSION assegno alla variabile 'username' il valore 'andrea'
$_SESSION["username"] = "andrea";

Con session_start(); il server assegna al mio PC un codice chiave simile a ‘765487cf34ert8dede5a562e4f3a7e12’ che distruggerà alla chiusura del browser.

Una volta assegnato l’identificativo la variabile e il suo valore saranno salvati sul server, ora potremo recuperare i dati da qualsiasi altra pagina con il codice seguente:

2. pagina due che ottiene le variabili


<?php
// 1. inizializzo la sessione
session_start();

// 2.
echo "Username is " . $_SESSION["username"];
print_r($_SESSION); // debug visualizza tutte le variabili di sessione

// 3. to change a session variable, just overwrite it 
$_SESSION["username"] = "Gianni";

// 4. remove all session variables
session_unset(); 

// 5. destroy the session 
session_destroy();

Symfony PHP Session senza sessioni ereditate (NO Legacy Sessions)

IMPORTANTE:
– NON deve essere già presente una sessione già inizializzata.
– NON utilizzare la sintassi PHP classica, è incompatibile con Symfony!!!

Symfony NON accede direttamente alla funzione globale $_SESSION di php perchè gestiche i dati tramite un oggetto proprietario ‘FlashBag()’ sebbene Symfony salvi anche il contenuto di $_SESSION quando la sessione viene salvata.


<?php

// src/AppBundle/Controller/SessionsTest.php
namespace AppBundle\Controller;

use Symfony\Component\HttpFoundation\Response; // namespace di Symfony per response()
use Symfony\Component\HttpFoundation\Session\Session; // namespace per le sessioni

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;// namespace per utilizzare @Route

class SessionsTest{
    
    /**
    * @Route("/sessiontest")
    */
    public function sessionAction()
    {
        echo 'Test Sessioni INIZIO<br>';
        
        // istanzio la classe di Symfony per le sessioni
        $session = new Session();
        // inizio la sessione
        $session->start();

        // salvo la variabile 'name' con il valore 'Andrea'
        $session->set('name', 'Andrea');
        // ottengo la variabile 'name'
        $username = $session->get('name');
        
        echo  'Username = ' . $username;

        // FlashBag() è un metodo di Symfony per gestire messaggi al visitatore inerenti le sessioni
        // setto un flash messages, assegno a 'notice' il valore 'Profile updated'
        $session->getFlashBag()->add('notice', 'Profile updated');

        // richiamo il messaggio
        //                              -> assegno $message='notice'
        foreach ($session->getFlashBag()->get('notice', array()) as $message) {
            echo '<div class="flash-notice">'.$message.'</div>';
        }
        
        // Renderizza
        /* 
        Test Sessioni INIZIO
        Username = Andrea
        Profile updated
        Test Sessioni FINE
         */
       
        return new Response('Test Sessioni FINE');
    }// END sessionAction()
} // END class SessionsTest {}

Puntare il browser a: http://localhost/symfonytest/first_test_symfony/web/sessiontest

Symfony PHP Session con sessioni ereditate (YES Legacy Sessions)

Se stiamo lavorando con una sessione aperta da un’applicazione PHP che non utilizza il componente HttpFoundation dovremo aggiungere alla nostra pagina Symfony il componente PhpBridgeSessionStorage che ci permette di utilizzare sessioni ereditate da $_SESSION[] di php classico.


// componenti obbligatori per la gestione delle sessioni
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\HttpFoundation\Session\Storage\PhpBridgeSessionStorage;

// configua la sessione ereditata 
ini_set('session.save_handler', 'files');
ini_set('session.save_path', '/tmp');
session_start();

// instanzia la classe Session(istanzia la classe PhpBridgeSessionStorage)
$session = new Session(new PhpBridgeSessionStorage());

// symfony ora è compatibile con la sessione precedente ed inizializzo la sessione
$session->start();

Bibliografia:

Sessioni:
http://symfony.com/doc/current/session.html

Sessioni no Legacy:
symfony.com/doc/current/components/http_foundation/sessions.html

Sessioni with Legacy:
symfony.com/doc/current/components/http_foundation/session_php_bridge.html