Facades
Las Facades proporcionan una sintaxis estatica conveniente para acceder a clases disponibles en el service container de Laravel. Aunque parecen llamadas a metodos estaticos, en realidad resuelven la instancia desde el contenedor y llaman al metodo correspondiente.
Ejemplos de uso
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
// Todas estas son llamadas a instancias reales del contenedor
Cache::put('key', 'value', 3600);
$users = DB::table('users')->where('active', true)->get();
Log::info('Usuario logueado', ['user_id' => $user->id]);
Como funcionan internamente
class Cache extends Facade
{
protected static function getFacadeAccessor(): string
{
return 'cache'; // Resuelve app('cache') del contenedor
}
}
Facades vs Inyeccion de dependencias
Aunque las facades son comodas, en muchos contextos es preferible usar inyeccion de dependencias para mejorar la testabilidad del codigo. Sin embargo, Laravel proporciona metodos de testing para mockear facades facilmente.
// En tests, puedes mockear cualquier facade
Cache::shouldReceive('get')
->once()
->with('key')
->andReturn('value');
Las Facades de tiempo real (real-time facades) permiten tratar cualquier clase como una facade anteponiendo Facades\ al namespace.