Запрет отправки сообщений чаще раза в минуту
На данный момент пользователи могут создавать и отправлять сообщения без ограничений по времени, хоть каждую секунду. Естественно это не очень хорошо. Вернее совсем не хорошо. Поэтому в этом разделе разберем, как добавить ограничение создания и отправки сообщений чаще раза в минуту.
Первым делом в класс политики ReplyPolicy добавим следующий метод:
public function create(User $user)
{
if (! $lastReply = $user->fresh()->lastReply) {
return true;
}
return ! $lastReply->wasJustPublished();
}
В данном методе, в условии мы проверяем, отправлял ли пользователь сообщение вообще, и если отправлял, то, как давно это было сделано. Если сообщение было отправлено меньше минуты назад, то новое сообщение уже не будет принято. Пользователю нужно будет подождать пока не пройдет минута со времени отправки последнего сообщения. Для работы данного функционала нам нужны два новых метода: lastReply() и wasJustPublished(). Добавим их далее.
Метод lastReply() добавим в модели пользователя User. Данный метод возвращает последнее сообщение из БД.
public function lastReply()
{
return $this->hasOne(Reply::class)->latest();
}
Метод wasJustPublished() добавим в модель Reply. Если сообщение было создано меньше минуты назад, то метод вернет true и тогда пользователь не сможет сохранить его в БД.
public function wasJustPublished()
{
return $this->created_at->gt(Carbon::now()->subMinute());
}
В контроллере RepliesController (метод store()) используем фасад Gate (Illuminate\Support\Facades\Gate) для проверки возможности добавления нового сообщения. Добавим в начало метода store() следующий код:
if (Gate::denies('create', new Reply)) {
return back()->with('warning', 'Вы добавляете сообщения слишком часто. Сделайте перерыв. :)');
}
В методе denies() мы указываем название метода (create) из класса политики ReplyPolicy, который мы добавили в самом начале.
Теперь в файле вида show.blade.php добавим код для вывода сообщения, отправляемого в вид из контроллера RepliesController.
Найдите следующий код в файле:
@foreach ($replies as $reply)
@include ('threads.reply')
@endforeach
И выше него добавьте новый код:
@if (session('warning'))
<div class="alert alert-warning alert-dismissable">
<button type="button" class="close" data-dismiss="alert">×</button>
{{ session('warning') }}
</div>
@endif
На этом работа закончена. Теперь на странице темы, на которой было отправлено два сообщения с разницей меньше минуты будет выводиться сообщение: «Вы добавляете сообщения слишком часто. Сделайте перерыв. :)».