La función rules en Yii es una de las herramientas más poderosas para garantizar la integridad de los datos sin escribir código manual de validación. Comprender cómo funcionan los core validators y los filtros permite construir aplicaciones seguras y robustas en una fracción del tiempo que tomaría hacerlo desde cero.
¿Cómo evitar registros duplicados con la validación unique?
Cuando un campo en la base de datos está definido como unique, como el username en una tabla de usuarios, intentar guardar un registro duplicado produce un error de SQL [01:07]. El error Integrity constraint violation, duplicate entry se lanza directamente desde la base de datos, lo que significa que la validación de tipo string pasa sin problema, pero el guardado falla.
Para resolver esto de forma elegante, basta con agregar la regla unique en el método rules del modelo [02:15]:
- Se declara el campo
username con la regla unique.
- Yii verifica automáticamente si ya existe un registro con ese valor antes de intentar guardarlo.
- Si el valor ya existe, devuelve un mensaje claro: "usuario Becko has already been taken".
Estas pocas líneas reemplazan todo el trabajo manual de consultar la base de datos, comparar resultados y devolver errores personalizados. El orden de ejecución de las reglas es importante: se ejecutan de arriba hacia abajo conforme están escritas [02:41].
¿Qué hace el filter y por qué no es un validador?
A diferencia de los demás core validators, filter no valida datos, sino que los transforma [03:15]. No devuelve true o false; devuelve el valor modificado que se usará de ahí en adelante.
Un ejemplo práctico es normalizar el username antes de guardarlo:
- Se aplica
strtolower() para convertir todo a minúsculas.
- Se usa
ltrim() y rtrim() para eliminar espacios y caracteres invisibles a izquierda y derecha.
php
['username', 'filter', 'filter' => function($value) {
$v = strtolower($value);
$v = ltrim($v);
$v = rtrim($v);
return $v;
}]
Esto garantiza que si alguien escribe "BECO" con mayúsculas o "Becko " con espacios al final, el sistema lo normaliza automáticamente [04:35]. El valor filtrado es el que se guarda en la base de datos, evitando confusiones por variaciones de mayúsculas y minúsculas que generarían usuarios aparentemente distintos.
¿Por qué guardar usernames en minúsculas?
Cuando no se normaliza, combinaciones como "Becko", "BECKO" y "becko" se tratan como registros diferentes. Esto genera confusiones graves en la gestión de usuarios [05:30]. Forzar minúsculas con el filtro elimina este problema de raíz.
¿Cómo validar un email con una sola línea?
Para agregar validación de correo electrónico, se declara un atributo público email en el modelo y se añade la regla correspondiente [06:00]:
php
['email', 'email']
- Yii verifica que el formato sea un correo válido.
- El navegador puede ofrecer una prevalidación en el frontend, pero la validación completa ocurre en el backend al intentar guardar.
- Un valor como "123" será rechazado, mientras que "jose@email.com" pasará sin problemas [07:02].
Agregar un nuevo campo al formulario sigue el mismo patrón: declarar el atributo, añadir la regla en rules y crear el input en la vista.
¿Qué buenas prácticas aplicar en el controlador?
Una práctica recomendada es inicializar valores sensibles en el controlador, como establecer password_repeats en cero [07:25]. Esto asegura un estado limpio antes de procesar los datos del usuario.
El flujo completo de datos en Yii queda así:
- Recibir datos del usuario a través de formularios.
- Validarlos con las reglas definidas en el modelo.
- Filtrarlos y transformarlos según sea necesario.
- Guardarlos en la base de datos con confianza.
Los core validators son numerosos y cada uno resuelve un problema específico. Estudiarlos a fondo permite pasar de cero a un MVP funcional en pocas horas, con una aplicación verdaderamente segura. ¿Ya has probado alguno de estos validadores en tus proyectos?