Ejercicio 2. Sesiones con CakePHP

Vamos a ver cómo se utiliza el componente de sesiones a través de un sencillo ejemplo en que un usuario del sistema introduce su nombre y su contraseña en un formulario de acceso. Este ejemplo es el de la documentación oficial, que puedes ver aquí.

Objetivos

1. Repasar la forma en que CakePHP ejecuta las acciones de los controladores.

2. Conocer los métodos mágicos de tipo FindBy<campo> de los modelos.

3. Conocer el componente de sesiones de CakePHP.

Notas

Se utiliza la primera instalación de CakePHP y no se cambia el nombre de la carpeta c:\wamp\www\discografia

Resolución

Creamos la base de datos ejercicio02 y la tabla usuarios:

create table usuarios (
id int(11) not null auto_increment,
login varchar(255) not null,
password varchar(32) not null,
nombre varchar(255) not null,
primary key(id)
);

Configuramos el archivo database.php para que CakePHP trabaje con la base de datos que acabamos de crear:

class DATABASE_CONFIG {
var $default = array(
'driver' => 'mysql',
'persistent' => false,
'host' => 'localhost',
'login' => 'root',
'password' => '',
'database' => 'ejercicio02',
'prefix' => '',
);
var $test = array(
'driver' => 'mysql',
'persistent' => false,
'host' => 'localhost',
'login' => 'root',
'password' => '',
'database' => 'ejercicio02',
'prefix' => '',
);
}

Creamos el modelo para la tabla usuarios:

class Usuario extends AppModel
{
   var $name = 'Usuario';
}

Creamos la vista login.thtml, que se ha traducido de la documentación oficial:

<?php if ($error): ?>

El nombre de usuario o la contraseña no son correctos: inténtalo otra vez.
<?php endif; ?>
<form action="<?php echo $html->url('/usuarios/login'); ?>" method="post">
   <fieldset>
      <label for="login">Usuario:</label>
      <?php echo $html->input('Usuario/login', array('size' => 20)); ?>
      <label for="password">Contraseña:</label>
      <?php echo $html->password('Usuario/password', array('size' => 20)); ?>
      <?php echo $html->submit('Entrar'); ?>
   </fieldset>
</form>

Creamos el archivo usuarios_controller.php y escribimos la lógica de la función login():

class UsuariosController extends AppController{
   function login(){
         $this->set('error', false);
         if (!empty($this->data)){
            $someone = $this->Usuario->findByLogin($this->data['Usuario']['login']);
            if(!empty($someone['Usuario']['password']) && $someone['Usuario']['password'] == $this->data['Usuario']['password']){
                  $this->Session->write('Usuario', $someone['Usuario']);
                  $this->redirect('/empresas/anadir_empresa');
               }
               else{
                  $this->set('error', true);
               }
            }
         }
}

Conclusiones

1. Sobre el método login() de UsuariosController. Los controladores se utilizan para manejar la lógica de un modelo y pueden tener cualquier número de acciones, que ejecuta automáticamente el despachador de CakePHP -generalmente se utilizan para mostrar vistas-. Cuando escribimos, en la barra de direcciones, http://localhost/discografia/usuarios/login, el despachador de Cake pasa la petición al controlador UsuariosController y éste ejecuta la acción.

2. Sobre el método mágico findByLogin() de Usuario. Hasta ahora, para recuperar los datos de las tablas, hemos utilizado el método findAll, que recupera todas las filas. En este ejercicio se utiliza por primera vez el método mágico findByLogin -de tipo findBy<nombreCampo>-, que se utiliza para recuperar los registros de la tabla usuarios cuyo login coincide con el nombre que introduce el usuario en el formulario. Como dice la documentación oficial, “estas funciones mágicas se utilizan como atajo para recuperar un registro, a partir de una tabla, un campo y un valor”. Disponemos de un método findBy para cada campo del modelo.

3. Sobre el componente de sesiones de Cake. “El componente de sesiones se utiliza para interactuar con la información de la sesión, e incluye la lectura y escritura básicas. El componente de sesiones está disponible de forma predterminada en los controladores”, dice la documentación oficial aquí. Vamos a comprobar esto, yendo a esta línea de código del método login() de UsuariosController:

   $this->Session->write(‘Usuario’, $someone[‘Usuario’]);

Si el usuario introduce datos en el campo login y la contraseña de la tabla usuarios coincide con la del formulario, entonces, gracias al método write() de la clase Session, se escribe una variable de sesión.

El componente de sesiones de Cake se encuentra en su núcleo, en la carpeta c:\wamp\www\discografia\cake\libs\controller\components\session.php, y extiende la clase CakeSession, que está en c:\wamp\www\discografia\cake\libs\session.php. El código del método write() de la clase SessionComponent es este:

 

function write($name, $value = null) {
if ($this->__active === true) {
$this->__start();
if (is_array($name)) {
foreach ($name as $key => $value) {
if (parent::write($key, $value) === false) {
return false;
}
}
return true;
}
if (parent::write($name, $value) === false) {
return false;
}
return true;
}
return false;
}

Ya para acabar, se puede contrastar esta forma de trabajar con las sesiones, mediante esta clase de CakePHP, con esta otra, de PHP, que hace uso de la matriz asociativa superglobar $_SESSION[].

 

Anuncios

4 comentarios

  1. Hola esta muy bien pero creo que el codigo no quedo completo por el espacio que le diste y se recorto 😦 ando buscando tambien un manual en espa para empezarle con CakePHP que me parece fenomental sale sigue asi estamos en contacto

  2. Buenas !!
    El blog me esta viniendo tela de bien 😀 pero tengo una duda …
    Supongo que la vista login.thtml usa el controlador usuarios_controller.php porque la clase lleva una función con el nombre de la vista pero… ¿y si quiero usar ese controlador en vistas distintas al login.thtml, que debo hacer?

    Un saludo y enhorabuena por el blog 🙂

    • Hola ark666, 😀

      Bueno, para ser un poco más precisos, la acción login() de UsuariosController renderiza (pinta) la vista login.thtml. Por otra parte, este mismo controlador, UsuariosController, puede renderizar tantas vistas como quieras; tan sólo tienes que definir una acción en él y crear su vista correspondiente. Por ejemplo, si creas la acción prueba(), entonces debes crear la vista prueba.thtml (si trabajas con la versión 1.1 de Cake) o prueba.ctp (si trabajas con la versión 1.2).

      Espero que esto responda a tu pregunta 😉 Por cierto, este otro post intenta explicar estos detalles y el funcionamiento del patrón de diseño de software MVC: https://tutorialcakephp.wordpress.com/2008/10/16/6-el-patron-de-diseno-mvc/. ¡Ah!, y una última cosa: la extensión .thtml es de Cake 1.1, pásate (si puedes) a CakePHP 1.2, esta versión es la que trabaja con las extensiones .ctp para las vistas. ¡Un saludo!

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: