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.
#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
Web Developer
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