Dominando la serialización de fechas en Laravel: Personaliza los formatos de fecha en tus modelos

  • Publicado el 27 septiembre, 2024
  • Palabras: 582

Al trabajar con fechas en Laravel, a menudo es necesario controlar cómo se formatean cuando los modelos se convierten en arrays o JSON. Laravel ofrece herramientas potentes para personalizar la serialización de fechas, lo que le permite mantener formatos de fechas consistentes en toda la aplicación. Veamos cómo puede aprovechar estas funciones.

Dominando la serialización de fechas en Laravel: Personaliza los formatos de fecha en tus modelos

#Serialización de fechas global

 

Laravel te permite personalizar el formato de serialización predeterminado para todos los atributos de fecha en tus modelos. Puedes hacerlo sobreescribiendo el método serializeDate en tu modelo:

 

/**
 * Prepare a date for array / JSON serialization.
 */
protected function serializeDate(DateTimeInterface $date): string
{
    return $date->format('Y-m-d');
}

 

Este método se utilizará para todos los atributos de fecha del modelo, incluidos created_at y updated_at.

 

#Formato de fecha por atributo

 

Si necesita formatos diferentes para distintos atributos de fecha, puede especificarlos en la propiedad $casts del modelo:

 

<?php

namespace AppModels;

use IlluminateDatabaseEloquentModel;

class Event extends Model
{
    protected $casts = [
        'start_date' => 'date:Y-m-d',
        'end_date' => 'date:Y-m-d',
        'created_at' => 'datetime:Y-m-d H:i:s',
        'updated_at' => 'datetime:Y-m-d H:i:s',
    ];
}

 

Este enfoque le permite tener un control detallado sobre el formato de cada atributo de fecha.

 

#Formato de fecha dinámico

 

A veces, es posible que necesites cambiar el formato de fecha de forma dinámica. Puedes lograrlo mediante el uso de accessors:

 

<?php

namespace AppModels;

use IlluminateDatabaseEloquentModel;
use IlluminateDatabaseEloquentCastsAttribute;

class Event extends Model
{
    protected function startDate(): Attribute
    {
        return Attribute::make(
            get: fn ($value) => $value->format('Y-m-d'),
        );
    }
}

 

Esto le permite aplicar una lógica de formato personalizada que puede cambiar según determinadas condiciones.

 

#Ejemplo práctico

 

Consideremos un ejemplo más completo en el que tenemos un modelo Appointment que necesita diferentes formatos de fecha para diferentes escenarios:

 

<?php

namespace AppModels;

use IlluminateDatabaseEloquentModel;
use IlluminateDatabaseEloquentCastsAttribute;
use DateTimeInterface;

class Appointment extends Model
{
    protected $casts = [
        'start_time' => 'datetime',
        'end_time' => 'datetime',
    ];

    protected function serializeDate(DateTimeInterface $date)
    {
        return $date->format('Y-m-d H:i:s');
    }

    protected function startTime(): Attribute
    {
        return Attribute::make(
            get: fn ($value) => $value->format('g:i A'),
        );
    }

    protected function endTime(): Attribute
    {
        return Attribute::make(
            get: fn ($value) => $value->format('g:i A'),
        );
    }

    protected function dateForHumans(): Attribute
    {
        return Attribute::make(
            get: fn () => $this->start_time->format('F j, Y'),
        );
    }

    public function toArray()
    {
        $array = parent::toArray();
        $array['date_for_humans'] = $this->date_for_humans;
        return $array;
    }
}

 

Al aprovechar las funciones de serialización de fechas de Laravel, puede asegurarse de que las respuestas de API y las representaciones de arrays de modelos siempre incluyan fechas en el formato que mejor se adapte a las necesidades de su aplicación. Este nivel de control te permite crear presentaciones de datos más sencillas y consistentes en toda su aplicación Laravel.

Antonio Jenaro

Antonio Jenaro

Web Developer

Archivado en:

Fuente: Harris Raftopoulos

Inicia la conversación

Hazte miembro de Antonio Jenaro para comenzar a comentar.

Regístrate ahora

¿Ya estás registrado? Inicia sesión