Controlador en Yii: Creación y Manejo de Usuarios

Clase 24 de 35Curso de Desarrollo Web con PHP y Yii2

Contenido del curso

Modelos, vistas y controladores

Enlaces, navegación y tablas intermedias

Resumen

Recibir y procesar datos del usuario es una de las tareas más críticas en cualquier aplicación web. En este recorrido se construye, paso a paso, la acción de un controlador en Yii que crea un usuario nuevo, validando y guardando la información con apenas quince líneas de código. Entender este flujo es fundamental antes de abordar formularios y reglas de validación.

¿Cómo se estructura el controlador para recibir datos del usuario?

El punto de partida es crear un UserController [0:47]. Se puede tomar como base cualquier controlador existente —en este caso el BookController— y adaptarlo. Lo esencial es contar con la clase del controlador, la referencia a la carpeta de vistas (usuarios) y al menos una acción pública.

La acción clave es actionNew [1:12]. Al acceder a miaplicacion.com/user/new, esta función decide qué mostrar. El proceso se entiende mejor leyéndolo de abajo hacia arriba:

  • Se retorna this->render('new.tpl'), enviando una variable llamada user.
  • Esa variable es un modelo vacío: $user = new User() [1:47].

Un modelo en este contexto funciona como un sobre de información. Cuando está vacío, le indica al template qué campos necesita pedir al usuario —en este caso username y password—. Cuando regresa lleno, trae los datos capturados en el formulario.

¿Por qué la acción recibe tanto GET como POST?

Una misma acción puede invocarse de dos formas [2:33]:

  • Sin POST: el usuario escribe la URL en el navegador. No hay datos en el request, así que se muestra el formulario vacío.
  • Con POST: el formulario ya fue llenado y enviado. El request contiene los datos que el modelo debe procesar.

Por defecto, el action del formulario HTML apunta al mismo controlador y la misma acción que lo generó. Esto simplifica el flujo porque toda la lógica de creación vive en un solo lugar.

¿Cómo detecta el modelo si hay datos en el POST?

Aquí aparece una de las funciones más potentes del framework. El modelo determina por sí mismo si existe información relevante en el request [3:15]:

php if ($user->load(Yii::$app->request->post())) { // Hay datos en POST que corresponden a este modelo }

El método load() revisa el contenido de Yii::$app->request->post() y, si encuentra datos que coinciden con los atributos del modelo, los carga automáticamente. Si no hay nada para él, simplemente continúa y renderiza el formulario vacío.

¿Qué sucede después de cargar los datos?

Una vez confirmado que hay información, el flujo sigue dos pasos encadenados [4:06]:

  1. Validar: if ($user->validate()) verifica que los datos cumplan las reglas definidas en el modelo.
  2. Guardar: if ($user->save()) persiste la información en la base de datos mediante Active Record, aunque el destino podría ser un archivo de texto u otra entidad.

Cada paso puede fallar de manera independiente. Un dato puede validar correctamente pero no guardarse porque la base de datos se cayó, por ejemplo.

¿Cómo se manejan los errores en este flujo?

Se contemplan dos escenarios de fallo [5:30]:

  • El guardado falla tras validar: se lanza una excepción con throw new \Exception('Error al salvar el usuario'). El throw corta la ejecución de inmediato, sin necesidad de un return explícito. No es la solución más user friendly, pero garantiza que el error no pase desapercibido.
  • La validación falla: no se intenta guardar. La ejecución cae naturalmente al return this->render() del final, que vuelve a mostrar el formulario con los datos que el usuario ingresó y, en cada campo, el mensaje de error correspondiente [6:15]. Esta característica se aprovecha al máximo con Active Form, tema de la siguiente sesión.

¿Qué pasa cuando todo sale bien?

Cuando el usuario se guarda correctamente [6:44]:

  • Se establece un flash message de éxito: Yii::$app->session->setFlash('success', 'Usuario guardado correctamente').
  • Se ejecuta un redirect hacia site/login, porque el flujo natural tras crear una cuenta es iniciar sesión.
  • El return $this->redirect() corta la ejecución para evitar que se vuelva a renderizar el formulario.

Con apenas quince líneas —incluyendo espacios— se cubre la recepción de datos, la carga al modelo, la validación, el guardado, el manejo de errores y la redirección exitosa. En las próximas sesiones se construirá el formulario con Active Form y se definirán las reglas de validación del modelo para tener el ciclo completo funcionando. ¿Qué validaciones consideras imprescindibles para un campo de contraseña?