Ir al contenido principal
Laravel, thinking fast.
Capitulo 9 · Los resultados de las herramientas no son respuestas

Deja que el resultado mueva la aplicación, no sólo la vista

Julian Beaujardin

Algunas cargas cambian más que la transcripción:

if (isset($data['site_id'])) {
    $state['siteId'] = $data['site_id'];
    $state['siteStatus'] = 'provisioning';
    $state['progressPercent'] = 30;
    $state = $this->updateOrAddProvisioningCard(30, $state);
}

if (isset($data['status'])) {
    if ($data['status'] === 'provisioning' && ! isset($data['site_id'])) {
        $state['progressPercent'] = min($state['progressPercent'] + 25, 85);
        $state = $this->updateOrAddProvisioningCard($state['progressPercent'], $state);
    }

    if ($data['status'] === 'completed') {
        $state['siteStatus'] = 'completed';
        $state['progressPercent'] = 100;
        $state['siteUrl'] = SiteUrl::normalise($data['display_url'] ?? $data['url'] ?? '');
        $state['messages'][] = ['role' => 'status', 'type' => 'completed', 'url' => $state['siteUrl']];
    }
}

Fíjate en min($state['progressPercent'] + 25, 85). El progreso aquí no se mide: se infiere. Cada comprobación de estado empuja la barra un poco, y se limita por debajo de 100 para que nunca pueda afirmar que ha terminado antes de que termine de verdad. Imprecisión honesta: la barra se mueve, y sólo la señal real la completa.

Fíjate también en $data['display_url'] ?? $data['url'] ?? '', y luego normalizado. Una carga ensamblada a varios servicios de distancia cambiará de forma tarde o temprano; una cadena de alternativas y un normalizador cuestan una línea y sobreviven a eso.

Y todo el manejador va envuelto:

catch (\Exception $e) {
    report($e);
}

Una carga malformada de una herramienta no debe tumbar un turno que ya ha producido buen trabajo. Repórtalo y conserva el estado que tengas.

Lo que sostiene este capítulo

  • No dejes que la prosa del modelo sea tu interfaz. Representa el resultado estructurado; la frase es un comentario.
  • Ramifica por claves de la carga, no por nombres de herramienta, para que los renombrados no rompan la representación y resultados parecidos compartan renderizador.
  • Salta en silencio una carga que no se decodifica. Debería costar una tarjeta, no la respuesta.
  • Da a los mensajes de estado su propio rol y un type, con todo lo que la vista necesita dentro.
  • Identifica cada tarjeta con un hash del contenido, para que dos tarjetas en una transcripción conserven su estado entre renderizados.
  • Distingue eventos de estado. Los eventos se añaden; el estado actualiza la tarjeta existente en su sitio.
  • Extrae enlaces, escapa, formatea y reinserta. Escapar primero codifica dos veces las URLs que ya contienen entidades.
  • Usa lista blanca de formato en lugar de pasar un analizador de markdown completo sobre texto no confiable.
  • Limita el progreso inferido por debajo de completado, y deja que sólo la señal real lo termine.
  • Envuelve el manejo de resultados para que una carga malformada no descarte el buen trabajo de un turno.