В конечном итоге я разделил некоторые обязанности между моделью и ее политикой.
Политика в конечном итоге отвечала за то, чтобы убедиться, что пользователь имеет право на выполнение определенного действия.Ничего более или менее:
class PostPolicy
{
public function publish(User $user, Post $post)
{
return $post->user_id !== $user->id;
}
}
Модель с другой стороны должна иметь логику, чтобы проверить, можно ли с ней выполнить определенное действие:
class Post extends Model
{
...
public function isPublishable()
{
return $this->show_at->lessThan(now());
}
...
}
Поэтому каждый экземпляр сообщения теперь можетскажите нам, может ли оно быть опубликовано.Наконец, мое Post::publishBy(User $user)
действие будет включать в себя сначала авторизацию пользователя для этого действия и проверку возможности публикации этого поста отдельно, чтобы мы могли определить конкретную причину, по которой публикация не удалась.
Мне кажется, этот дизайн подходит лучше,оставляя политики Laravel делать только то, что они должны делать (авторизуя действия пользователя) и требуя, чтобы модели отвечали только за вещи, которые их касаются.