Saltar al contenido
Julián Campos
  • Inicio
  • Blog
  • Qué hago
  • Quién soy
  • Newsletter
  • Contacto
  • Casos de éxito
Julián Campos

Menú principal

Servicios, casos y contenido para decidir mejor tu próxima web.

  • Inicio
  • Blog
  • Qué hago
  • Quién soy
  • Newsletter
  • Contacto
  • Casos de éxito
Cuéntame tu proyecto

Newsletter técnica

El anti-patrón que está matando tu proyecto silenciosamente

Por qué dejé de usar controladores estándar (y qué uso ahora)

12 de febrero de 2026 5 minutos de lectura Julian Campos
  • arquitectura
  • arquitectura de software,
  • De CERO a SENIOR
  • Producto
  • programacion

Tabla de contenidos

  1. El anti-patrón del controlador “Dios”
  2. La solución: Action + Invokable Controllers
  3. ¿Por qué merece la pena esta forma de trabajar?

Hay una fase en la construcción de un producto que casi nadie documenta, pero que todos sufrimos: la capa donde HTTP se encuentra con el Dominio.

Ese punto exacto en el que:

  1. Llegan las peticiones del usuario.

  2. El sistema tiene que decidir qué hacer con ellas.

  3. Y hay que devolver una respuesta sin romper nada por el camino.

Y aquí es terriblemente fácil equivocarse.

Porque cuando empiezas a construir un proyecto en Laravel (o cualquier framework MVC), la tentación es fuerte y tienes a crear controladores enormes, a meter la lógica en ellos “provisionalmente”, devolver datos sin pensar demasiado en la estructura y a copiar y pegar comportamiento entre rutas.

Parece rápido y parece práctico…. Hasta que un día abres un controlador con 600 líneas te preguntas quién ha hecho ese desastre. Y la respuesta duele: fuiste tú, hace tres semanas.


Si has seguido las entregas anteriores de KPIAds, sabrás que ya tenemos:

  • Qué hace el usuario (casos de uso).

  • Qué dejamos en la base de datos (entidades y relaciones).

  • Cómo piensa el negocio (bounded contexts).

Ahora toca responder a lo tangible:

👉 ¿Dónde vive cada parte de la lógica?

👉 ¿Qué ocurre exactamente cuando un usuario hace click?

👉 ¿Qué archivos toman decisiones y cuáles no?

En otras palabras: pasamos del QUÉ del dominio al CÓMO del código.

El anti-patrón del controlador “Dios”

Si vienes de tutoriales básicos, es normal que caigas en esto:

  1. Recibes la request en el controlador.

  2. Validar los datos ahí mismo.

  3. Llamas a 3 servicios distintos o haces las queries ahí mismo.

  4. Haces cálculos de negocio ahí mismo.

  5. Renderizas la vista.

Eso funciona al principio… y se convierte en un infierno después ya que los controladores enormes tienen tres problemas letales:

  1. Mezclan responsabilidades (saben demasiado).

  2. Son imposibles de testear (tienes que simular todo el proceso HTTP para probar una suma).

  3. Duplican lógica por todas partes.

Y hay un síntoma universal: cada nueva funcionalidad hace el código más frágil.

La solución: Action + Invokable Controllers

En KPIAds he tomado una decisión de arquitectura clara desde el principio y es que cada endpoint HTTP se implementa con un controlador invocable.

Es decir, cada endpoint se implementa con un solo método llamado __invoke.(

¿Por qué? Porque de esta forma toda la lógica de negocio vive en una Action.

Esto te obliga a tener controladores pequeños, encapsular la lógica en clases reutilizables y dar a cada caso de uso su propio espacio.

Por ejemplo, tendremos ShoProjectMetricsController el cual delega en GetProjectMetricsAction.

La primera se dedica a HTTP y la segunda se dedica al Dominio.

De esta forma toda petición en KPIAds sigue el mismo camino sagrado:

➡️ El usuario hace una petición
➡️ Route encuentra el controlador invocable
➡️ Controller valida y delega
➡️ Action ejecuta el caso de uso
➡️ Controller decide formato de respuesta
➡️ View (Blade) presenta los datos

O resumido así: Route → Controller → Action → View

La clave es que cada paso hace solo una cosa.

Si queremos llevar esto a un ejemplo real donde, por ejemplo, el usuario entre a un dashboard de métricas y quiera ver ingresos, gasto, ROAS y CAC el proceso sería:

  1. La ruta dice dónde vive ese endpoint.

  2. El controlador recibe la request y valida que tengas permisos.

  3. La action calcula, consulta al repositorio y empaqueta los datos.

  4. La vista lo presenta.

Además de ser un proceso mucho más lógico y ordenado, este patrón tiene unas ventajas que cualquier desarrollador debería tener en cuenta como:

  • Puedes testear la Action de forma aislada con test unitarios.

  • Puedes llamar a esa misma Action desde un job, un comando de consola o una API externa (importante si queremos escalar el proyecto a futuros).

  • Y no necesitas abrir 8 archivos para entender qué pasa en el proceso.

¿Por qué merece la pena esta forma de trabajar?

Porque te prepara para el futuro sin complicarte el presente.

Hoy KPIAds es un monolito pero gracias a este diseño, mañana podría:

  • Mover Actions pesadas a colas (Jobs).

  • Exponer endpoints API sin tocar controladores.

  • Migrar acciones a microservicios.

  • Reemplazar Blade por Inertia o Livewire.

Y nada de eso rompe la idea central: una petición HTTP no es un caso de uso, solo es el disparador.


Con esta entrega quería, además de compartirte el progreso de KPIAds (que llevaba un par de semanas sin hacerlo) dejarte claro que trabajar con un monolito no significa que vivamos en un caos.

El desorden lo creas tú.

Cuando decides conscientemente dónde vive la lógica, cómo viajan los datos y qué responsabilidades tiene cada capa, cada nueva funcionalidad se vuelve una extensión natural, no una amenaza.

Con esto completo, KPIAds ya está preparado para la siguiente estación.

Nos vemos en la próxima entrega

Julián

Publicado originalmente en CERO a SENIOR.

Volver a newsletter

CONTACTO

¿Hablamos de tu proyecto?

Si has llegado hasta aquí, es que algo de lo que has leído tiene sentido para ti. Rellena el formulario, te llevará menos de 1 minuto (según mis cálculos o incluso menos) y organizamos una llamada para darle forma.

  • En 48h laborables tendrás una respuesta en tu bandeja de entrada.
  • Si soy la persona adecuada, nos ponemos cara en una llamada para entender bien qué necesitas.
  • Trabajo con pocos proyectos a la vez. Prefiero hacer pocas cosas bien que muchas regular.

Paso 1 de 3

Paso 2 de 3

Paso 3 de 3

¡Buena jugada!

Tu formulario ha llegado. Ahora me toca a mí hacer el siguiente movimiento.

En menos de 48h (laborables) tendrás mi respuesta en tu buzón. No será una respuesta automática ni una propuesta a base de plantillazo. Me lo miro al detalle, lo analizo y te cuento.

Y mientras esperas mi respuesta…

Y mientras esperas mi respuesta…
Te cuento que en 2012 jugué en el Open Internacional de Sevilla contra el Gran Maestro Vladim Malakhatko (hasta salió en el ABC). Yo con negras. Me ganó, pero no encontró la jugada que le aseguraba ganarme una calidad y, casi seguro, la partida.
¿La encuentras tú antes de que yo te responda?

Arrastra una pieza para probar tu jugada

¿La encuentras tú antes de que yo te responda? [bajo el tablero] Toca mover negras y ganan la jugada

Julián Campos

Consultoría técnica, WordPress, integraciones, migraciones y formación para empresas que necesitan criterio senior.

Hablemos

NAVEGACIÓN

  • Inicio
  • Servicios
  • Sobre mí
  • Casos de éxito
  • Blog
  • Contacto

SERVICIOS

  • Consultoría técnica y Fractional CTO
  • Desarrollo WordPress
  • Integraciones y automatización
  • Migraciones de plataformas
  • Formación técnica

REDES

  • LinkedIn
  • X
  • GitHub
© 2026 Julián Campos
  • Privacidad
  • Cookies
  • Legal