Extender Carbon con macros
Un overview a cómo extender Carbon añadiendo métodos propios.
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();