Ir al contenido principal
Laravel, shipping fast.

La primera versión de esta integración tenía una pieza más. Entre la facade y el driver había un Manager, construido sobre Illuminate\Support\Manager, la clase base que está detrás de los drivers de sesión, de hashing y de notificaciones de Laravel. Podía elegir entre drivers por nombre. El sistema en producción del que sale este libro todavía lo tiene.

Elegía entre un solo driver.

Eso es una abstracción con una sola implementación, justo aquello de lo que el prefacio te dijo que desconfiaras, y yo la había escrito por la razón contra la que el prefacio advertía: quizá algún día llegue un segundo proveedor. Costaba cuatro saltos para tres llamadas, y una clase que cada desarrollador nuevo tenía que leer para descubrir que todavía no hacía nada.

El contrato también es una abstracción con una sola implementación, y se queda. Lo que los separa es el costo. El Manager era una capa que se ejecutaba: cada llamada pasaba por él. El contrato son diez líneas que nunca se ejecutan. Enumera lo que la aplicación puede pedirle a un proveedor, en los tipos propios de la aplicación, y es lo que un test reemplaza. También es como está armado el propio Laravel: las facades del framework llegan a servicios que están detrás de las interfaces de Illuminate\Contracts.

Además te da todo lo que el futuro necesita. Si llega un segundo proveedor, escribes un segundo driver y cambias las pocas líneas que nombran al primero. Si después la aplicación tiene que elegir entre ellos en tiempo de ejecución, ese es el día de recurrir al Manager, y llevará una tarde, porque la frontera ya está en el lugar correcto.

Todo junto

POST /api/licenses
  -> StoreLicenseRequest      valida, o responde 422
  -> LicenseController@store  una llamada, un código de estado
  -> Licenses (facade)        encuentra el driver enlazado
  -> StatamicDriver           llama al proveedor
  -> License                  tipado, o lanza una excepción
  -> LicenseResource          lo que el cliente puede ver
  -> 201 { "data": { ... } }

Cada paso tiene un solo trabajo y puede probarse por separado.

Resumen del capítulo 3

  • Si tienes un modelo de Eloquent, úsalo. Un objeto tipado ocupa el lugar de un modelo solo cuando los datos viven en otra parte.
  • Convierte el array de un proveedor en un objeto tipado en el borde, y falla ahí cuando venga mal formado, con una excepción propia.
  • Un contrato habla en los tipos de tu aplicación, nunca en los del proveedor.
  • Configura el cliente HTTP una vez, como una macro. Un driver por proveedor, y que lance una excepción cuando falle.
  • Nunca construyas una URL del proveedor concatenando algo que envió quien llama.
  • Reintenta solo lo que es seguro reintentar, y nunca duermas más allá de tu propio timeout.
  • Enlaza el driver al contrato y dale una facade. En los tests, reemplaza el contrato. Añade un Manager cuando haya un segundo driver que gestionar, y no antes.

No se pudo cargar el audio. Inténtalo de nuevo en un momento.