Curso de Desarrollo Web con PHP y Yii2

Login funcional en Yii2 con User y LoginForm

Curso de Desarrollo Web con PHP y Yii2

Contenido del curso

Modelos, vistas y controladores

Enlaces, navegación y tablas intermedias

Login funcional en Yii2 con User y LoginForm

Resumen

Implementar un sistema de login en Yii2 se vuelve sorprendentemente simple cuando entiendes cómo interactúan el modelo User, el LoginForm y las vistas con Smarty. Aquí verás cómo autenticar usuarios, mostrar datos según su sesión y respetar la separación de responsabilidades entre modelo, controlador y vista.

¿Cómo funciona el login en Yii2 después de modificar el modelo User?

Después de ajustar la clase User que viene con la instalación de Yii, el login web queda operativo sin escribir código adicional. Toda la lógica de autenticación (consulta a base de datos, verificación de contraseña, integración con sistemas de terceros) recae en el modelo, así que con el modelo bien configurado, el flujo funciona de inmediato [01:00].

Para probarlo basta con ingresar credenciales válidas, por ejemplo username Beco y password Patito123, y la sesión queda activa.

¿Qué hace el modelo User en Yii2? Centraliza la lógica de autenticación: consulta la base de datos, valida contraseñas y conecta con sistemas externos si los hay. Si está bien configurado, el login funciona sin tocar el controlador.

¿Qué diferencia hay entre el modelo User y el LoginForm?

La instalación base de Yii incluye dos modelos clave que conviene distinguir.

  • User: es un active record que representa al usuario en la base de datos.
  • LoginForm: es un modelo simple, no active record, que actúa como sobre de envío de información desde la vista al controlador.
  • LoginForm contiene username, password y un rememberMe booleano para mantener la sesión activa [02:10].

¿Dónde vive la lógica de validación del password?

Dentro de LoginForm existe el método validatePassword, que revisa errores y trae al usuario desde la base. Si la validación falla, devuelve el mensaje incorrect username or password. Puedes enriquecer ese feedback con Yii::$app->session->setFlash('error', ...) para mostrarlo en la interfaz [03:30].

¿Qué hace el action login del SiteController?

El SiteController tiene un actionLogin que instancia un LoginForm, recibe los datos del formulario y delega la autenticación. Es el puente entre lo que el usuario escribe en la vista y la lógica que vive en el modelo.

¿Cómo accedo al usuario logueado desde una vista en Smarty?

Una vez que el usuario está autenticado, su información viaja con la sesión y queda disponible en toda la aplicación a través de Yii::$app->user. Para verlo en acción, puedes cambiar el render del actionIndex del SiteController para que apunte a un archivo index.tpl en lugar de index.php, aprovechando Smarty como motor de plantillas.

Dentro del .tpl puedes usar lógica condicional así:

smarty {if Yii::$app->user->isGuest}

<p>Hola, invitado</p> {Html::a('login', ['site/login'])} {else} <p>Hola, {Yii::$app->user->identity->username}</p> {/if}

La propiedad isGuest te dice si hay sesión activa, y identity devuelve la instancia del modelo User con todos sus atributos [06:20].

¿Qué es Yii::$app->user->identity? Es la instancia del modelo User correspondiente al usuario autenticado. Te permite acceder a propiedades como username, email o cualquier campo definido en tu active record.

¿Por qué no debo ejecutar queries desde la vista?

Es tentador escribir algo como Book::find()->count() directamente en la plantilla para mostrar cuántos libros hay en el sistema. Funciona, pero rompe la separación de responsabilidades del patrón MVC.

La forma correcta es declarar la variable en el controlador y pasarla a la vista:

php // En SiteController use app\models\Book;

public function actionIndex() { $bookCount = Book::find()->count(); return $this->render('index', ['bookCount' => $bookCount]); }

Y en la vista solo desplegar el dato:

smarty

<p>Hay {$bookCount} libros en el sistema</p>

En el ejemplo el sistema arroja 215 libros, pero el punto importante es otro: la vista solo despliega y recopila información, nunca consulta la base [09:40].

¿Por qué Smarty es tan estricto con las funciones?

Smarty no permite usar funciones que no estén dadas de alta explícitamente. Por ejemplo, si le mandas un arreglo, no puedes hacer count() dentro de la plantilla, porque contar elementos es responsabilidad del controlador o del modelo. Esta restricción te obliga a mantener limpia la arquitectura.

Habilidades y conceptos clave del flujo de autenticación

  • Active Record vs Modelo simple: User extiende ActiveRecord y mapea a la base; LoginForm solo transporta datos del formulario [02:10].
  • rememberMe: opción booleana del LoginForm que extiende la duración de la sesión.
  • Yii::$app->user: componente global que expone la sesión del usuario actual, con métodos como isGuest e identity.
  • setFlash: método de sesión para mostrar mensajes temporales como errores de login [03:50].
  • Render con Smarty: cambiar la extensión de .php a .tpl permite usar el motor Smarty sin tocar el resto del controlador [05:30].
  • Find chain: los métodos all(), one() y count() de find() definen qué tipo de resultado esperas del query.
  • Separación MVC: el modelo ejecuta queries, el controlador orquesta y la vista solo despliega.

¿Has implementado un login con Yii2 en algún proyecto? Cuéntame en los comentarios qué retos enfrentaste al separar la lógica entre User y LoginForm.