Esto modificamos en Site.Controller:

y este es el archivo index.tpl:

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
Usercorrespondiente al usuario autenticado. Te permite acceder a propiedades comousername,
¿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
User extiende ActiveRecord y mapea a la base; LoginForm solo transporta datos del formulario [02:10].LoginForm que extiende la duración de la sesión.isGuest e identity..php a .tpl permite usar el motor Smarty sin tocar el resto del controlador [05:30].all(), one() y count() de find() definen qué tipo de resultado esperas del query.¿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.
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.
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.
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].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].
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.
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
Usercorrespondiente al usuario autenticado. Te permite acceder a propiedades comousername,
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].
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.
User extiende ActiveRecord y mapea a la base; LoginForm solo transporta datos del formulario [02:10].LoginForm que extiende la duración de la sesión.isGuest e identity..php a .tpl permite usar el motor Smarty sin tocar el resto del controlador [05:30].all(), one() y count() de find() definen qué tipo de resultado esperas del query.¿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.
Julio Cardenas
Esto modificamos en Site.Controller:
y este es el archivo index.tpl:
Dave Juanes
Tengo el siguiente error
Viene de la línea:
hola invitado, {HTML::a('login', \['site/login'])}
Como puedo solucionarlo? o que puede causar el error?
Alberto Alcocer
ProfesorEl problema es que la invocación a la función estática es Html::a y NO HTML::a ;)
Dave Juanes
Muchas gracias Beco, estuve semanas con eso!!!!