→推荐:《laravel教程》
由于项目中使用到了消息通知功能,于是自然而然写出了如下代码
public function index(Request $request){ $notifications = \\Auth::user()->notifications()->paginate($request->size); return $this->success($notifications);}
然而发现日期格式化不对
但是模型基类使用了 HasDateTimeFormatter
trait, 代码如下:
<?phpnamespace 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\\HasDatabaseNotifications
的 notifications()
方法关联的是Illuminate\\Notifications\\DatabaseNotification
这个类, 由于这个类是laravel 自带的, 所以serializeDate
方法自然不会起作用。
找到了问题所在,那就解决吧。首先定义自己的 Notification
模型类, 继承自框架自带的 Illuminate\\Notifications\\DatabaseNotification
类,再引用 HasDateTimeFormatter
trait,代码如下:
<?phpnamespace 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
模型来关联,代码如下:
<?phpnamespace 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'); }}
问题解决,效果如下: