在 Laravel 中掌握日期序列化:自定义模型的日期格式

385 阅读1分钟

在 Laravel 中处理日期时,您通常需要控制在将模型转换为数组或 JSON 时如何格式化它们。Laravel 提供了强大的工具来自定义日期序列化,使您能够在整个应用程序中保持一致的日期格式。让我们深入了解如何利用这些功能。

全局日期序列化

Laravel 允许您为模型中的所有日期属性自定义默认序列化格式。您可以通过覆盖模型中的 serializeDate 方法来执行此操作:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use DateTimeInterface;

class YourModel extends Model
{
    /**
     * Prepare a date for array / JSON serialization.
     *
     * @param  \DateTimeInterface  $date
     * @return string
     */
    protected function serializeDate(DateTimeInterface $date)
    {
        return $date->format('Y-m-d');
    }
}

此方法将用于模型中的所有日期属性,包括 created_at 和 updated_at

按属性的日期格式

如果你需要为不同的 date 属性使用不同的格式,你可以在模型的 $casts 属性中指定它们:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

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',
    ];
}

此方法允许您对每个日期属性的格式进行精细控制。

动态日期格式

有时,您可能需要动态更改日期格式。您可以通过使用访问器来实现此目的:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Casts\Attribute;

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

这允许您应用可根据特定条件更改的自定义格式设置逻辑。

实例

让我们考虑一个更全面的示例,其中我们有一个 Appointment 模型,它针对不同的场景需要不同的日期格式:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Casts\Attribute;
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;
    }
}

通过利用 Laravel 的日期序列化功能,您可以确保您的 API 响应和模型的数组表示始终包含最适合您应用程序需求的格式的日期。这种级别的控制允许您在整个 Laravel 应用程序中创建更加用户友好和一致的数据表示。