由于項(xiàng)目中使用到了消息通知功能,于是自然而然寫出了如下代碼
public function index(Request $request) { $notifications = \Auth::user()->notifications()->paginate($request->size); return $this->success($notifications); }
然而發(fā)現(xiàn)日期格式化不對(duì)
但是模型基類使用了 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'); } }
查看源代碼發(fā)現(xiàn) Illuminate\Notifications\Notifiable 這個(gè) trait 有兩個(gè) trait,其中
Illuminate\Notifications\HasDatabaseNotifications 的 notifications() 方法關(guān)聯(lián)的是Illuminate\Notifications\DatabaseNotification 這個(gè)類, 由于這個(gè)類是laravel 自帶的, 所以serializeDate方法自然不會(huì)起作用。
找到了問題所在,那就解決吧。首先定義自己的 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(); } }
最后我們?cè)?User 模型中覆蓋 notifications() 方法,使用我們自己定義的 Notification 模型來關(guān)聯(lián),代碼如下:
<?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'); } }
問題解決,效果如下: