Skip to main content

¿Qué es una facade?

Una facade proporciona una interfaz “estática” a las clases disponibles en el contenedor de servicios de la aplicación. Laravel incluye numerosas facades que dan acceso a casi todas sus funcionalidades. Las facades de Laravel funcionan como “proxies estáticos” sobre las clases reales del contenedor y ofrecen una sintaxis concisa y expresiva manteniendo mejor testabilidad y flexibilidad que los métodos estáticos tradicionales. Todas las facades de Laravel están en el namespace Illuminate\Support\Facades.
No pasa nada si aún no comprendes por completo su funcionamiento. Empieza por aprender a usarlas y continúa aprendiendo Laravel.

Cómo funciona una facade

En una aplicación Laravel, una facade es una clase que da acceso a un objeto del contenedor. Este mecanismo se implementa con la clase Facade. Todas las facades de Laravel y las tuyas propias extienden la clase base Illuminate\Support\Facades\Facade. La clase base Facade utiliza el método mágico __callStatic() para delegar las llamadas a la facade al objeto resuelto desde el contenedor.
Importamos la fachada Cache en la parte superior del archivo. Esa fachada actúa como proxy hacia una implementación de la interfaz Illuminate\Contracts\Cache\Factory. Todas las llamadas a través de la fachada se pasan a la instancia interna del servicio de caché de Laravel. Si miras la clase Illuminate\Support\Facades\Cache, verás que no existe el método estático get.
Cache extiende la clase base Facade y define getFacadeAccessor(). Este método devuelve el nombre del binding en el contenedor. Cuando llamas a un método estático de Cache, Laravel resuelve el binding cache del contenedor y ejecuta el método solicitado (get en este caso) sobre el objeto obtenido.

Cuándo usar facades y cuándo no

Ventajas de las facades

Ofrecen una sintaxis concisa y fácil de recordar para usar las funcionalidades de Laravel, sin necesidad de recordar los nombres de clase largos que habría que inyectar o configurar manualmente. Además, gracias al uso particular de los métodos dinámicos de PHP, son fáciles de probar.

Cuidado con el crecimiento del ámbito

Un peligro habitual al usar facades es la “acumulación de responsabilidades” en la clase. Como son cómodas y no requieren inyección, es fácil que la clase se hinche usando muchas facades. Con la inyección de dependencias, un constructor grande te avisa visualmente. Al usar facades, mantén las clases pequeñas y con responsabilidad acotada.
Si notas que una clase crece demasiado, considera dividirla en clases más pequeñas.

Facades vs. inyección de dependencias

Una gran ventaja de la inyección de dependencias es poder sustituir la implementación inyectada. Es útil en las pruebas: puedes inyectar mocks o stubs y comprobar qué métodos se han llamado sobre ellos. Los métodos estáticos “puros” no se pueden mockear normalmente, pero las facades sí, ya que redirigen las llamadas al objeto del contenedor mediante métodos dinámicos. Se pueden probar como si se tratara de una instancia inyectada.
Para esta ruta puedes escribir la siguiente prueba comprobando que Cache::get se llama con los argumentos esperados.

Facades vs. funciones helper

Además de las facades, Laravel ofrece funciones “helper” para tareas comunes: crear vistas, disparar eventos, despachar jobs, enviar respuestas HTTP, etc. Muchas hacen lo mismo que la facade correspondiente.
No hay diferencia sustancial entre facades y helpers. Aunque uses helpers, puedes hacer las mismas pruebas que con las facades.

Facades en tiempo real

Con las facades en tiempo real, puedes tratar cualquier clase de tu aplicación como una fachada. Veamos primero un ejemplo sin usarlas. Supón que el modelo Podcast tiene un método publish. Para publicar el podcast necesita una instancia de Publisher.
Con una facade en tiempo real puedes mantener la misma testabilidad sin tener que pasar explícitamente la instancia de Publisher. Para crearla, añade el prefijo Facades al namespace de la clase que importas.
Cuando se usa una facade en tiempo real, la implementación se resuelve desde el contenedor usando la parte de interfaz o clase que aparece después del prefijo Facades.
Las facades en tiempo real son útiles cuando quieres poder mockear en pruebas sin tener que pasar dependencias como argumentos.

Cómo probar facades

Para probar una facade usa shouldReceive, que devuelve una instancia mock de Mockery. Como las facades se resuelven y gestionan a través del contenedor, son mucho más fáciles de probar que los métodos estáticos habituales.
Métodos habituales del mock:

Lista de facades principales

Tabla de facades habituales, sus clases reales y sus bindings en el contenedor.

Próximos pasos

Contracts (contratos)

Aprende sobre los Contracts, la contraparte conceptual de las facades, y cuándo elegir uno u otro.
Última modificación el 13 de julio de 2026