Crear facades en Laravel de forma automágica

Las Facades son clases que proveen una interfaz estática a ciertas clases registradas en el Service Container de Laravel. Veamos cómo crearlas de forma automática.

Crear facades en Laravel de forma automágica
Photo by Edson Junior / Unsplash

Hoy he vuelto a escribir después de un par de meses de espera, y espero seguir el ritmo :-)

Una de las cosas que más me gustan de Laravel, aunque criticada por los detractores de Laravel, son las Facades.

Las Facades son clases que proveen una interfaz estática a ciertas clases registradas en el Service Container de Laravel. Por ejemplo, en lugar de hacer esto:

$this->cache->get($key);

Lo cual requiere configurar nuestro constructor con la inyección de dependencias necesaria, podemos hacer esto:

Cache::get($key);

Laravel hace mucho uso de las facades en el sistema y en los paquetes de terceros. Sin embargo, crear una facade sin entender bien cómo funciona el service container es un poco lioso. Hace poco descubrí esta forma de crear facades automáticamente en Laravel.

Crear facades automáticamente en Laravel

Supongamos que tengo la siguiente clase:

<?php

namespace App\Services;

class PriceFormatter {
    public function __construct(
    	private string $currency = 'EUR';
    ) {
        //
    }

    public function currency(string $currency): static
    {
    	$this->currency = $currency;
        return $this;
    }

    public function format(int|float $price): string
    {
        return number_format($price, 2, ',', '.') . $this->currency;
    }
}

Ahora, para usarla, tendríamos que instanciarla y llamar al método format:

use App\Services\PriceFormatter;

$formatter = new PriceFormatter();
$price = $formatter->format(10); // 10,00€

Para convertir esta clase en una facade automáticamente, solo tenemos que añadir Facades\ al inicio del use:

use Facades\App\Services\PriceFormatter;

$price = PriceFormatter::format(10); // 10,00€

Así de simple es la creación de Real Time Facades en Laravel!