2 visitas

Por qué usar Enums nativos de PHP 8.1 supera a los enums en base de datos

Descubre cómo los Enums de PHP 8.1 mejoran la calidad, mantenibilidad y seguridad en proyectos PHP, y cómo combinarlos estratégicamente con enums de base de datos para arquitecturas robustas y escalables.

Introducción

En el desarrollo moderno con PHP, la gestión de valores constantes y la representación de estados o tipos específicos es fundamental. Tradicionalmente, equipos confiaban en enums almacenados en bases de datos, pero con PHP 8.1 surge una oportunidad para mejorar calidad y mantenibilidad usando Enums nativos. Aquí exploramos sus ventajas y cómo combinarlos eficientemente.

Desventajas de enums en base de datos

  • Falta de semántica en código: Los valores se manejan como strings o números, dificultando legibilidad y aumentando riesgos de errores.
  • Mantenimiento complejo: Cambios requieren migraciones que pueden impactar datos y esquemas.
  • Validación duplicada: Se valida tanto en base de datos como en el código, creando redundancia.
  • Limitada expresividad: No permiten asociar comportamientos o lógica a los valores.

Ventajas de Enums nativos de PHP 8.1

  • Tipado estricto: Detecta errores en desarrollo.
  • Mayor expresividad: Pueden tener métodos y propiedades.
  • Modelado claro del dominio: Encajan con arquitecturas DDD.
  • Validación automática: Solo se permiten valores definidos.
  • Facilidad para testing: Mejores mocks y pruebas aisladas.

Ejemplo práctico: estados de órdenes con PHP Enum

enum OrderStatus: string {
    case Pending = 'pending';
    case Processing = 'processing';
    case Shipped = 'shipped';
    case Delivered = 'delivered';
    case Cancelled = 'cancelled';

    public function canTransitionTo(OrderStatus $newStatus): bool {
        return match ($this) {
            self::Pending => in_array($newStatus, [self::Processing, self::Cancelled]),
            self::Processing => in_array($newStatus, [self::Shipped, self::Cancelled]),
            self::Shipped => $newStatus === self::Delivered,
            self::Delivered, self::Cancelled => false,
        };
    }
}

function updateOrderStatus(int $orderId, OrderStatus $newStatus): void {
    $order = OrderRepository::find($orderId);
    if (!$order->status->canTransitionTo($newStatus)) {
        throw new InvalidArgumentException("Transición de estado inválida.");
    }
    $order->status = $newStatus;
    OrderRepository::save($order);
}

Cómo mapear con base de datos

Se almacena en DB el valor string, usando restricciones para mantener integridad. Al recuperar:

$orderStatus = OrderStatus::from($dbRecord['status']);

Este enfoque evita valores mágicos dispersos y garantiza validación inmediata.

Conclusiones

Usar Enums nativos de PHP eleva la calidad del software, facilita mantenimiento y mejora la expresión del dominio. Los enums en base de datos siguen siendo esenciales para integridad. La estrategia híbrida —tipar siempre en PHP y validar mínimamente en DB— potencia colaboración, testing y escalabilidad. Como desarrollador senior, recomiendo adoptar este paradigma para entregar soluciones limpias y sostenibles en proyectos PHP modernos.

Me dedico a crear soluciones web eficientes y a compartir mi conocimiento con la comunidad de desarrolladores.

Alejandro Leone
Backend Developer