Symfony/Validator para PHP: guía completa con ejemplos prácticos
1. ¿Qué es y para qué sirve?
La librería Symfony/Validator es un componente potente y flexible del ecosistema Symfony, diseñado para la validación de datos. A diferencia de las comprobaciones simples "sobre la marcha", este componente ofrece un enfoque declarativo: describes las reglas de validación (restricciones) mediante anotaciones, atributos de PHP 8+, YAML, XML o arrays de PHP, y luego pasas los datos a un servicio especial: ValidatorInterface. Esto permite separar la lógica de validación de la lógica de negocio de la aplicación, haciendo que el código sea más limpio, testeable y reutilizable.
¿Para qué sirve? En cualquier aplicación web (y no solo web), los datos provienen de fuentes no confiables: formularios en el sitio, solicitudes API, importaciones de archivos CSV. Sin validación, corres el riesgo de sufrir inyecciones SQL, ataques XSS, cálculos incorrectos o simplemente "basura" en la base de datos. Symfony/Validator resuelve estos problemas de forma integral: verifica tipos de datos, longitudes de cadenas, rangos numéricos, unicidad de correos electrónicos, coincidencia con expresiones regulares y mucho más. Además, recopila todos los errores en un único objeto ConstraintViolationList, que se puede convertir fácilmente en una respuesta JSON para una API o mostrarse como una lista de errores en un formulario.
El componente es completamente independiente del framework Symfony. Puedes usarlo en cualquier proyecto PHP (Laravel, Yii, tu propio framework o incluso PHP "puro"). Tiene un mantenimiento activo, una documentación excelente y una comunidad enorme. Es el "estándar de oro" de la validación en el mundo PHP.
2. Instalación
La instalación se realiza a través de Composer. Ejecuta en la terminal, en la raíz de tu proyecto:
composer require symfony/validator
También se recomienda instalar el componente symfony/property-access para un correcto funcionamiento con objetos y arrays anidados:
composer require symfony/property-access
Si planeas usar anotaciones/atributos, asegúrate de tener instalado doctrine/annotations (para PHP 7.x) o estar usando PHP 8+ con atributos nativos.
3. Inicio rápido: ejemplo mínimo funcional
Vamos a crear una clase simple User con atributos de validación y la validaremos.
<?php
// 1. Cargamos el autoload de Composer
require_once 'vendor/autoload.php';
// 2. Importamos las clases necesarias
use Symfony\Component\Validator\Validation;
use Symfony\Component\Validator\Constraints as Assert;
// 3. Creamos la clase con atributos de validación (PHP 8+)
class User {
#[Assert\NotBlank(message: "El nombre no puede estar vacío")]
#[Assert\Length(min: 2, max: 50, minMessage: "El nombre debe tener al menos {{ limit }} caracteres")]
public string $name;
#[Assert\NotBlank]
#[Assert\Email(message: "El email '{{ value }}' no es válido.")]
public string $email;
#[Assert\PositiveOrZero]
public int $age;
}
// 4. Creamos el validador
$validator = Validation::createValidatorBuilder()
->enableAttributeMapping() // Habilitamos el mapeo de atributos
->getValidator();
// 5. Creamos un objeto con datos incorrectos
$user = new User();
$user->name = 'A'; // Nombre demasiado corto
$user->email = 'no-es-un-email';
$user->age = -5;
// 6. Validamos
$violations = $validator->validate($user);
// 7. Procesamos los errores
if (count($violations) > 0) {
foreach ($violations as $violation) {
echo $violation->getPropertyPath() . ': ' . $violation->getMessage() . "\n";
}
} else {
echo "¡Datos válidos!";
}
Este ejemplo mostrará:
name: El nombre debe tener al menos 2 caracteres
email: El email 'no-es-un-email' no es válido.
age: Este valor debe ser positivo o igual a cero.
4. Métodos/funciones/clases principales
4.1. Validation::createValidatorBuilder()
Firma: