Personalizando el objeto sfUser de Symfony 1/2

Presentación del sfUser

Dando continuidad a los artículos de Symfony quiero mostrarles algo que fue de mucha utilidad cuando lo conseguí hacer. Para los que no lo saben el objeto sfUser es el encargado de manejar las sesiones dentro de Symfony desaconsejando completamente el uso del array superglobal $_SESSION. Este objeto maneja por dentro la sesión del usuario y a esta funcionalidad le agrega mejoras interesantes para que los desarrolladores no tengamos que sufrir tanto. Esto es lo que nos dice el manual de Symfony:

En Symfony, el desarrollador no tiene que manipular directamente las
sesiones, sino que usa el objeto sfUser, que representa al usuario
final de la aplicación.

Para acceder al objeto sfUser, o lo que es lo mismo, para obtener o guardar datos en sesión, tenemos diferentes formas de hacerlo aunque siempre invocando a este objeto. Desde cualquier action, por estar extendiendo de sfActions, podemos acceder directamente asi:

$this->getUser()

Desde el layout principal o cualquier template (incluso partials) tenemos un atajo representado por una variable que mágicamente existe llamada

<?php $sf_user ?>

Desde cualquier parte del proyecto podemos usar la ruta completa de esta manera, incluso si no estoy dentro de un action.

sfContext::getInstance()->getUser()

Este objeto tiene tres métodos que vamos a usar ahora:

->setAttribute($name, $value, $ns = null);

Este método asigna un valor a la sesión lo que sería equivalente a hacer $_SESSION['name'] = 'value';

Aquí tenemos dos parámetros obligatorios el nombre que vamos a usar para la sesión y el valor a almacenar. El tercer parámetro opcional lo explico al final.

->getAttribute($name, $default = null, $ns = null);

Con este método obtenemos un valor de la sesión. Lo que sería igual a obtener el valor de $_SESSION['name']

El único parámetro obligatorio que recibe este método es el nombre de que va a buscar en la sesión. El segundo parámetro opcional es muy interesante; si no se encuentra la sessión me permite obtener un valor por defecto que yo le pase.

->hasAttribute($name, $ns = null);

Este lo que hace es consultar si una variable de sesión existe. Sería equivalente a hacer isset($_SESSION['name'])

Como habrán notado, los tres métodos tienen un último parámetro opcional $ns, este sería un namespace. Serviría para que yo pueda crear una variable de sesión bajo un nombre específico y solo existiría bajo ese nombre, de estas forma yo puedo crear mas de una variable de sesión con el mismo nombre pero bajo nombres diferentes:

$this->getUser()->setAttribute('nombre', 'John Doe', 'USUARIO');

$this->getUser()->setAttribute('nombre', 'Another John', 'USUARIO_ADMINISTRADOR');

$this->getUser()->setAttribute('usuario', 'ajohn', 'USUARIO_ADMINISTRADOR');

De esta manera puedo organizar los valores guardados en sesión y los más interesante puedo borrar de una vez todas las variables de sesión de una namespace específico sin alterar los otros utilizando otro método del sfUser

$this->getUser()->getAttributeHolder()->removeNamespace('USUARIO_ADMINISTRADOR');

Por el momento esto sería todo. La idea de este artículo es básicamente dar una introducción al objeto sfUser a fin de poder ir creando nuevos artículos más avanzados sobre esto y luego posiblemente hacer una unión entre el BaseActions y el sfUser que venimos creando.

Puedes ver el siguiente artículo sobre esta seria aquí

Comenta este artículo