Extender Carbon con macros

Un overview a cómo extender Carbon añadiendo métodos propios.

Extender Carbon con macros
Photo by Glen Carrie / Unsplash

Recientemente tuve que crear un sistema de importación con un proveedor externo, y tenían un formato de fechas un tanto extraño. Para evitar repetir en mi código $date→format('Y') . str($date→format('z') + 1)→padLeft(3, '0') constantemente, decidí extender Carbon con una macro.

Cómo funcionan las macros

Las macros son muy útiles y están presentes en multitud de clases de Laravel. Nos permiten extender la funcionalidad de ciertas clases añadiéndoles métodos que luego podremos usar en nuestro código.

A grosso modo, su funcionamiento se basa en un array $macros = [] y un método parecido al siguiente:

public static function macro(string $name, $macro)
{
	self::$macros[$name] = $macro;
}

Cómo usar macros en Carbon

Para usarlas en Carbon podemos llamar al método macro desde nuestro service provider:

public function boot()
{
	Carbon::macro('toProviderDate', static function () {
		return self::this()->format('Y') . str(self::this()->format('z') + 1)->padLeft(3, '0');
	});
}

Esta sintaxis de static function y self::this() es algo más propio de Carbon que de las macros de Laravel.

Ahora ya podemos usar toProviderDate() en nuestras fechas y se ejecutará ese método de formateo:

$date = now()->toProviderDate();