Formulario de login (y logout) básico en Symfony 1.4
En el post anterior creamos un sistema de registro de usuarios básico para Symfony 1.4. Lo que vamos a hacer ahora es un sistema de login (y logout) para que el usuario pueda iniciar sesión en nuestra web.
Primero creamos el formulario de login, por lo que creamos un nuevo archivo:
/lib/form/LoginForm.class.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <?php class LoginForm extends BaseForm { public function configure() { parent::configure(); $this->setWidgets(array( 'email' => new sfWidgetFormInput(), 'password' => new sfWidgetFormInputPassword(), )); $this->setValidators(array( 'email' => new sfValidatorEmail(array('required'=>true), array('required'=>'El email es obligatorio')), 'password' => new sfValidatorString(array('required'=>true), array('required'=>'Escribe tu contraseña')), )); $this->widgetSchema->setNameFormat('login[%s]'); $this->widgetSchema->setFormFormatterName('list'); } } |
El formulario no tiene mayor misterior. Un input text para el email y un input password para la contraseña. Validamos que se hayan rellenado los dos campos.
Editamos las actions del módulo user que creamos en el post anterior para añadir el login.
/apps/frontend/modules/user/actions/actions.class.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | <?php class userActions extends sfActions { public function executeLogin(sfWebRequest $request) { $this->form = new LoginForm(); if($request->isMethod("post")){ $this->form->bind($request->getParameter("login")); if($this->form->isValid()){ if(!$user = UserTable::login($this->form->getValue("email"), $this->form->getValue("password"))){ // No hemos conseguido loguear al usuario // Redirigimos de nuevo al login con un mensaje de error $this->getUser()->setFlash("error", "datos incorrectos"); $this->redirect("@user_login"); }else{ // Logueamos $this->getUser()->setAuthenticated(true); $this->getUser()->setAttribute("id",$user->id); // Comprobamos si tiene referer, si no, le llevamos a la homepage $url = $this->getUser()->getAttribute("referer",false)?:"@homepage"; $this->getUser()->setAttribute("referer", false); $this->redirect($url); } } } } |
Tenemos que comprobar si existe ese email junto con esa contraseña en nuestra base de datos. Si es así, logueamos al usuario y, si no, mostramos un mensaje de error.
La comprobación de si existe el usuario en la base de datos la hacemos en la linea 12, donde llamamos al método estático «login» del archivo UserTable.class.php del modelo.
/lib/model/doctrine/UserTable.class.php
1 2 3 4 5 6 7 8 9 10 11 | <?php class UserTable extends Doctrine_Table { public static function login($email,$password){ return Doctrine_Query::create() ->from('User u') ->where('u.email = ?', array($email)) ->andWhere('u.password = ?', array(md5($password))) // Podrimos usar otro algoritmo, en este caso utilizamos md5 ->fetchOne(); } } |
Y eso es todo, lo más sencillo para el final: la plantilla donde mostramos el formulario.
/apps/frontend/modules/user/templates/loginSuccess.php
1 2 3 4 5 6 7 | <?php if($sf_user->getFlash("error")): ?> <div class="error"><?php echo $sf_user->getFlash("error"); ?></div> <?php endif; ?> <form action="<?php echo url_for("@user_login"); ?>" method="post"> <?php echo $form; ?> <input type="submit" value="Entrar" /> </form> |
En este paso sería lógico desarrollar el logout para poder cerrar la sesión en la web. Para ello modificamos de nuevo la actions de nuestro módulo para añadir la nueva funcionalidad:
/apps/frontend/modules/user/actions/actions.class.php
1 2 3 4 5 6 7 8 9 | <?php class userActions extends sfActions { public function executeLogout(sfWebRequest $request){ $this->getUser()->setAuthenticated(false); $this->getUser()->getAttributeHolder()->clear(); $this->redirect("@homepage"); } } |
Para ejecutar el logout, solo debemos crear un enlace en nuestra web donde se llame a esta action. No necesitamos plantilla ya que después de logout siempre redirigiremos a la homepage.
<?php echo link_to("Cerrar sesión", '@user_logout'); ?> |
Debemos añadir las siguientes rutas en el archivo routing.yml:
user_login: url: /login param: { module: user, action: login } user_logout: url: /logout param: { module: user, action: logout } |
Cualquier duda en los comentarios!
Buena muchas gracias! aunque… La primera parte para fregistrarse me funcionó bien, pero la parte de hacer el login cuando ingreso un nombre (mail, le puse nombre en vez de mail) y password en la pagina login «Invalid». Es decir que el form no es válido, al menos eso creo porque tampoco entra al if($this->form->isValid()) de la accion executeLogin(sfWebRequest $request) :S…
La verdad llevo unas semanas metiéndome en Symfony recién, no sé si ya te había pasado eso a tí.
De todas maneras gracias por el tutorial, si se te ocurre que puedo estar haciendo mal te agradecería que pudieras indicarmelo.
Saludos!
¿Te muestra algún error la barra de debug?
Fijate que no hayas cambiado estas dos líneas:
En LoginForm.class.php
$this->widgetSchema->setNameFormat(‘login[%s]’);
En actions.class.php
$this->form->bind($request->getParameter(«login»));
mmm Nops no las he cambiado…
La primera parte es está así,
————————
…
$this->widgetSchema->setNameFormat(‘login[%s]’);
$this->widgetSchema->setFormFormatterName(‘list’);
}
}
————————
Exactamente igual a tu parte y la parte de la acción está así
————————
public function executeLogin(sfWebRequest $request)
{
$this->form = new LoginForm();
$this->flag=0;
if($request->isMethod(«post»)){
$this->flag=1;
$this->form->bind($request->getParameter(«login»));
if($this->form->isValid()){
…
———————–
El flag lo agregué nada más para darme cuenta hasta que if entraba
Seguiré revisando a ver que pasa :/
Saludos
Dices que has puesto «nombre» en vez de «email». Quizás el formulario no te valida por que estás escribiendo un nick, siendo el validador un sfValidatorEmail, por lo que debes escribir un email en el campo «nombre».
yo estoy haciendo lo del login pero necesito con propel noc si me pudieras ayudar con eso
Solo queria agradecer por este pequeño tuto. Me ha servido de mucha ayuda.
Gracias! 😀
buenas tardes, muy buena la información, quisiera saber si tiene alguna información sobre el uso de permisos y demás del uso del plugin sfDoctrineGuardPlugin. gracias,
Hola buen manual, pero tengo una duda, como hacer por si son diferentes tipos de usuarios, estoy haciendo un sistema donde son 3 tipos diferentes (alumno, maestro, admin), y pues cada uno tiene diferente paginas cuando entran, como se haria el login
Hola casor, deberías incluir un nuevo campo en tu base de datos llamado, por ejemplo, user_type. El login se haría igual pero, al cargar los datos del usuario que acaba de iniciar sesión, deberías comprobar el valor de user_type y cargar una página u otra dependiendo del tipo de usuario que sea.
Un saludo.
Que tal yo tambien utilizo propel y que es lo que tendria que editar en vez de la
«class UserTable extends Doctrine_Table»
algun ejemplo?
Hola, muchas gracias por el post…
Se puede verificar que la direccion de correo exista (no solo que sea vAlida sino existente)?
Hola,
hice el ejemplo tal cual pero tengo una problema pero cuando se loguea. Al volver al layout.php y quiero mostrar el nombre el usuario que se logueo tiene la propiedad $sf_user->isAuthenticated() en false. Que puede estar fallando?
Gracias
lo hice tal cual pero no acepta las validaciones pasa directo
walterio,
tienes que crear una clase usuario en tuapp/lib, por ejemplo myUser.class.php y que extienda de sfBasicSecurityUser.
No se menciona en este artículo.
¡Felicitaciones por el sistema de logueo! Para los que necesitamos algo simple, esta es la solución ideal
hola amigo e seguido los pasos peor cuando ingreso el formulario, me sale el siguiente error..
Notice: Undefined variable: form in /Applications/MAMP/htdocs/abcofinal/apps/frontend/modules/contacto/templates/indexSuccess.php on line 177
Fatal error: Call to a member function render() on a non-object in /Applications/MAMP/htdocs/abcofinal/apps/frontend/modules/contacto/templates/indexSuccess.php on line 177