I often use interface on eloquent models when it has polymorphic relationship. For example,
interface ToggleableActivity
{
public function activity(): MorphOne;
}
class Bookmark extends Model implements ToggleableActivity
{
public function activity(): MorphOne
{
return $this->morphOne(UserActivity::class, 'subject');
}
}
class PostLike extends Model implements ToggleableActivity
{
public function activity(): MorphOne
{
return $this->morphOne(UserActivity::class, 'subject');
}
}
and other such thing which I can use inside my service class
final class ActivityService
{
public function toggleActivity(ToggleableActivity $model): void
{
UserActivity::withoutEvents(fn () => $model->activity()
->withTrashed()
->updateOrCreate(
[
'user_id' => $model->user_id,
],
[
'type' => $model->getActivityType(),
'reward' => $this->pointsToMaxLevel($model),
'deleted_at' => null,
'created_at' => now(),
'updated_at' => now(),
]
));
}
}
This is to help IDE to determine model relationship without type-hinted the real model class