Helper Session.
Funciones para manipular datos de la $_SESSION

Code Helper

Helpers – Session – $_SESSION

En la sesión es donde guardamos los datos que queremos preservar mientras el usuario navega por la aplicación. Con estas funciones podremos obtener y guardar datos de la variable superglobal $·_SESSION.

Los valores se guardan serializados. Se puede inicializar nuevas sesiones o recargar otras sesiones mediante su identificador.

/**
 * HeleprSession.php
 * @author      Code Develium
 */

namespace Helpers;

/**
 * Class HeleprSession
 */
abstract class HelpSession
{
    /**
     * Guarda un valor en la sesión.
     * El valor es guardado en la sesion de forma serializada.
     *
     * @param string $clave
     * @param object $valor
     */
    public static function setValue($clave, $valor = null)
    {
        $_SESSION[ $clave ] = serialize($valor);
    }

    /**
     * Inicia una sessión
     *
     * @param string|null $sessionId
     */
    public static function init($sessionId = null): void
    {
        /*  Comprobar que no haya una sesión ya iniciada */
        if ( PHP_SESSION_NONE == session_status()) {
            if (!empty($sessionId)) {
                session_id($sessionId);
            }
            session_start();
            return;
        }
        if (!empty($sessionId) && $sessionId != session_id()) {
            session_destroy();
            session_id($sessionId);
            session_start();
        }
    }

    /**
     * Devuelve un valor guardado en la sesión.
     * Si no esta definido devuelve null.
     * El valor es guardado en la sesion de forma serializada.
     *
     * @param string $clave
     *
     * @return mixed
     */
    public static function getValue( $clave)
    {
        if (!isset($_SESSION[ $clave ])) {
            alert("Valor $clave no existe en $_SESSION");
            return null;
        }
        return unserialize($_SESSION[ $clave ]);
    }


    /**
     * Devuelve un valor guardado en la sesión como un string.
     * Si no esta definido devuelve null.
     * El valor es guardado en la sesion de forma serializada
     *
     * @param string $clave
     *
     * @return string
     */
    public static function getString($clave)
    {
        if (!isset($_SESSION[ $clave ])) {
            alert("Valor $clave no existe en $_SESSION");
            return null;
        }
        return strval(unserialize($_SESSION[ $clave ]));
    }

    /**
     * Si no esta definido devuelve null
     * El valor es guardado en la sesion de forma serializada.
     * Si no es un valor numérico, lanza una alert.
     *
     * @param string $clave
     *
     * @return int
     */
    public static function getInt($clave)
    {
        if (!isset($_SESSION[ $clave ])) {
            alert("Valor $clave no existe en $_SESSION");
            return null;
        }
        $tmpInt = unserialize($_SESSION[ $clave ]);
        if (!is_numeric($tmpInt)) {
            alert("Valor SESSION no es un integer: $clave = $tmpInt");
            return $tmpInt;
        }
        return intval($tmpInt);
    }

    /**
     * Devuelve un valor guardado en la sesión como un bool.
     * Si no esta definido devuelve null.
     * El valor es guardado en la sesion de forma serializada.
     * Si no es un valor bool, lanza una alert.
     *
     * @param string $clave
     *
     * @return bool
     */
    public static function getBool($clave)
    {
        if (!isset($_SESSION[ $clave ])) {
            alert("Valor $clave no existe en $_SESSION");
            return null;
        }

        $tmpBool = unserialize($_SESSION[ $clave ]);

        if (!is_bool($tmpBool)) {
            alert("Valor SESSION no es un bool: $clave = $tmpBool");
            return $tmpBool;
        }
        return boolval($tmpBool);
    }

    /**
     *  Destruye la sesion
     */
    public static function destroy(): void
    {
        /* Comprobar si la sesión está iniciada */
        if ( PHP_SESSION_ACTIVE == session_status()) {
            session_destroy();
            session_unset();
        }
    }

    /**
     * Elimina un valor guardado en la sessión
     *
     * @param string $clave
     */
    public static function removeValue($clave)
    {
        unset($_SESSION[ $clave ]);
    }

    /**
     * Comprobar si la sessión esta caducada.
     * Si despues de N minutos, no ha habido una recarga, se destruye
     * la sesión.
     * Cada recarga de sessión se actualiza el tiempo.
     */
    public static function isTimeOut(): void
    {
        /* Comprobar que el usuario esta autenticado */
        $minutosExpiracion = 30;

        // Sólo si hay caducidad y esta logeado
        if ( $minutosExpiracion > 0) { //&& !empty(App::$Usuario) && 
                                   //App::$Usuario->usuario_id > 0) {

            $fechaUltimaAccion = self::getValue('_ULTIMA_ACCION_');

            /* Existe control de tiempo */
            if (!empty($fechaUltimaAccion)) {

                // Tiempo de inactividad
                $segundosInactivo = time() - $fechaUltimaAccion;

                // Segundos de timeout
                $expirarDespuesDe = $minutosExpiracion * 60;

                if ($segundosInactivo >= $expirarDespuesDe) {
                    // Sesión caducada
                    session_destroy();
                    // redireccionar a otra página
                    die();
                }

            }
            self::setValue('_ULTIMA_ACCION_', time());
        }
    }

}