Almacenamiento de datos en la sesión

El componente de sesión proporciona contenedores orientados a objetos para acceder a datos de la sesión.

Las razones para utilizar este componente en lugar de sesiones "crudas":

  • Aislar fácilmente datos de sesión en las aplicaciones en el mismo dominio
  • Interceptar donde se establecen los datos de la sesión en su aplicación
  • Cambiar el adaptador de la sesión según las necesidades de aplicación

Iniciando sesión

Algunas aplicaciones requieren sesiones intensivas, casi cualquier acción que realiza requiere acceso a datos de la sesión. Hay otras que acceden a datos de la sesión casualmente. Gracias al contenedor de servicio, podemos asegurar que la sesión se accede sólo cuando sea claramente necesario:

<?php

use Phalcon\Session\Adapter\Files as Session;

// Iniciar sesión por primera vez cuando algún componente solicite el servicio de session
$di->setShared(
    'session',
    function () {
        $session = new Session();

        $session->start();

        return $session;
    }
);

Factory

Carga la clase de adaptador de sesión utilizando la opción adapter

<?php

use Phalcon\Session\Factory;

$options = [
    'uniqueId'   => 'my-private-app',
    'host'       => '127.0.0.1',
    'port'       => 11211,
    'persistent' => true,
    'lifetime'   => 3600,
    'prefix'     => 'my_',
    'adapter'    => 'memcache',
];

$session = Factory::load($options);

Almacenamiento/recuperación de datos en sesión

Desde un controlador, una vista o cualquier otro componente que amplíe Phalcon\Di\Injectable puede acceder al servicio de sesión y almacenar elementos y recuperarlos de la siguiente manera:

<?php

use Phalcon\Mvc\Controller;

class UserController extends Controller
{
    public function indexAction()
    {
        // Establecer una variable de sesión
        $this->session->set('user-name', 'Michael');
    }

    public function welcomeAction()
    {
        // Verifica si la variable esta definida
        if ($this->session->has('user-name')) {
            // Retrieve its value
            $name = $this->session->get('user-name');
        }
    }

}

Destrucción/eliminación de sesiones

También es posible eliminar variables específicas o destruir toda la sesión:

<?php

use Phalcon\Mvc\Controller;

class UserController extends Controller
{
    public function removeAction()
    {
        // Eliminar una variable de sesión
        $this->session->remove('user-name');
    }

    public function logoutAction()
    {
        // Destruye toda la sesión
        $this->session->destroy();
    }
}

Aislamiento de datos de la sesión entre aplicaciones

Algunas veces un usuario puede usar la misma aplicación dos veces, en el mismo servidor, en la misma sesión. Seguramente, si utilizamos variables en sesión, queremos que cada aplicación tenga datos de sesión separados (aunque con el mismo código y los mismos nombres de variables). Para resolver esto, puede agregar un prefijo para cada variable de sesión creada en una aplicación determinada:

<?php

use Phalcon\Session\Adapter\Files as Session;

// Aislar los datos de la sesión
$di->set(
    'session',
    function () {
        // Todas las variables creadas serán prefijadas con 'my-app-1'
        $session = new Session(
            [
                'uniqueId' => 'my-app-1',
            ]
        );

        $session->start();

        return $session;
    }
);

No es necesario agregar una ID única.

Bolsas de sesión

Phalcon\Session\Bag es un componente que ayuda a separar los datos de la sesión en namespaces. Al trabajar de esta manera, puede crear fácilmente grupos de variables de sesión en la aplicación. Al configurar solo las variables en el bag, se almacena automáticamente en la sesión:

<?php

use Phalcon\Session\Bag as SessionBag;

$user = new SessionBag('user');

$user->setDI($di);

$user->name = 'Kimbra Johnson';
$user->age  = 22;

Datos persistentes en componentes

El controlador, los componentes y las clases que amplían Phalcon\Di\Injectable pueden inyectar una Phalcon\Session\Bag. Esta clase aísla variables para cada clase. Gracias a esto puede persistir datos entre solicitudes en cada clase de forma independiente.

<?php

use Phalcon\Mvc\Controller;

class UserController extends Controller
{
    public function indexAction()
    {
        // Crear una variable persistente 'nombre'
        $this->persistent->name = 'Laura';
    }

    public function welcomeAction()
    {
        if (isset($this->persistent->name)) {
            echo 'Welcome, ', $this->persistent->name;
        }
    }
}

En un componente:

<?php

use Phalcon\Mvc\User\Component;

class Security extends Component
{
    public function auth()
    {
        // Create a persistent variable 'name'
        $this->persistent->name = 'Laura';
    }

    public function getAuthName()
    {
        return $this->persistent->name;
    }
}

Los datos agregados a la sesión ($this->session) están disponibles en toda la aplicación, mientras que los persistentes ($this->persistent) solo se pueden acceder en el ámbito de la clase actual.

Implementar tus propios adaptadores

La interfaz Phalcon\Session\AdapterInterface debe implementarse para crear sus propios adaptadores de sesión o ampliar los existentes.

Hay más adaptadores disponibles para estos componentes en laPhalcon Incubator