Formateo Global Usando Blade Stringable en Laravel

Spread the love

Cuando trabajas con Blade es frecuente que se quieras dar un formato determinado a algunos objetos que usas en tus plantillas, como suele suceder cuando trabajas con fechas.

Normalmente si usas una instancia de Carbon y quieres formatear una fecha usando un formato específico, puedes hacerlo de la siguiente forma en Blade.

{{ $user->created_at->format('d-m-Y') }}

Esto está bien.

Pero pronto te vas a dar cuenta que estas repitiendo lo mismo en otros lugares de tu aplicación. Cuando todo lo que quieres es darle un formato similar en todos los lugares donde se encuentra la instancia de Carbon.

Y en este tipo de situaciones es cuando te preguntas:

¿Existe una forma de formatear objetos de forma global en Blade?

Blade Stringable

Como resultado, Blade en Laravel 8 tiene el método Blade::stringable() que te permite interceptar insancias de cualquier clase y devolver un resultado que se imprimira en Blade.

Si quieres que cada objeto Carbon encontrado en tus plantillas de Blade tenga un formato determinado, puedes usar Blade::srtingable(), solo tienes que definir este método en App\Providers\AppServiceProvider de ls siguiente forma.

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Blade;
use Carbon\Carbon;

class AppServiceProvider extends ServiceProvider
{
    public function boot()
    {
        Blade::stringable(fn (Carbon $date) => $date->format('Y/m/d'));
    }
}

Una vez hecho esto, no es necesario formatear manualmente las fechas basadas en Carbon.

{{ $user->created_at }}

El formato especificado en Blade::stringable se aplicará a todas las fechas disponibles de Carbon en tu aplicación.

Inclusive si despues quieres formatear usando fechas localizadas solo tendrias que hacer cambios minimos:

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Blade;
use Carbon\Carbon;

class AppServiceProvider extends ServiceProvider
{
    public function boot()
    {
        Blade::stringable(function(Carbon $date) {
            return $date->locale(app()->getLocale())
                ->translatedFormat('F/j/Y');
        });
    }
}

¿Qué te parece?

Puedes aplicar esto a casi cualquier clase en el que requieras formatear sus resultados.