Laravel 7 訊息通知日期序列化解決方案

王成濤發表於2021-06-29

由於專案中使用到了訊息通知功能,於是自然而然寫出瞭如下程式碼

public function index(Request $request)
{
    $notifications = \Auth::user()->notifications()->paginate($request->size);

    return $this->success($notifications);
}

然而發現日期格式化不對

Laravel 7 訊息通知日期序列化解決方案

但是模型基類使用了 HasDateTimeFormatter trait, 程式碼如下:

<?php

namespace App\Models\Traits;

trait HasDateTimeFormatter
{
    protected function serializeDate(\DateTimeInterface $date)
    {
        return $date->format($this->dateFormat ?: 'Y-m-d H:i:s');
    }
}

檢視原始碼發現 Illuminate\Notifications\Notifiable 這個 trait 有兩個 trait,其中
Illuminate\Notifications\HasDatabaseNotificationsnotifications() 方法關聯的是Illuminate\Notifications\DatabaseNotification 這個類, 由於這個類是laravel 自帶的, 所以serializeDate方法自然不會起作用。
找到了問題所在,那就解決吧。首先定義自己的 Notification 模型類, 繼承自框架自帶的 Illuminate\Notifications\DatabaseNotification 類,再引用 HasDateTimeFormatter trait,程式碼如下:

<?php

namespace App\Models;

use App\Models\Traits\HasDateTimeFormatter;
use Illuminate\Notifications\DatabaseNotification;

class Notification extends DatabaseNotification
{
    use HasDateTimeFormatter;

    public function notifiable()
    {
        return $this->morphTo();
    }
}

最後我們在 User 模型中覆蓋 notifications() 方法,使用我們自己定義的 Notification 模型來關聯,程式碼如下:

<?php

namespace App\Models;

use App\Models\Traits\HasDateTimeFormatter;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Tymon\JWTAuth\Contracts\JWTSubject;

class User extends Authenticatable implements JWTSubject
{
    use Notifiable, HasDateTimeFormatter;

    public function notifications()
    {
        return $this->morphMany(Notification::class, 'notifiable')->orderBy('created_at', 'desc');
    }
}

問題解決,效果如下:

Laravel 7 訊息通知日期序列化解決方案

本作品採用《CC 協議》,轉載必須註明作者和本文連結
為了點個贊,專門註冊的賬號

相關文章