В Laravel 5, используя запрос формы, чтобы действовать в качестве шлюза проверки, и учитывая код ниже:
контроллер
public function decline(Request $request, InviteDeclineRequest $validation, $id)
{
$invite = Invite::find($id);
$invite->status = 'declined';
$invite->save();
}
СформироватьЗапрос
class InviteDeclineRequest extends Request {
public function rules()
{
return [
# this is referring to the incoming data,
# not the existing data
'status': 'pending',
];
}
}
Как я могу изменить вышеуказанный набор правил проверки, чтобы сказать, что входящий вход действителен, только если статус существующей записи установлен на «в ожидании». Т.е. нельзя разрешить отклоненное приглашение, если существующее не ожидает рассмотрения.
Опция 1:
Поместите эту логику в контроллер. Возможно, вышеупомянутое не считается частью проверки (хотя я бы сказал, что это так), и поэтому не относится к FormRequest.
Вариант 2:
Поместите логику в метод Authorize метода FormRequest. Единственным недостатком этого является то, что авторизация должна быть для контроля доступа, а не для проверки данных.
Вариант 3:
Расширьте запрос формы, чтобы включить третий метод, который проверяет существующие данные, а также входящие данные. Немного больно, так как мне нужно убедиться, что он вызывается как часть цикла запроса.
Вариант 4:
Добавьте пользовательское правило проверки:
http://laravel.com/docs/5.0/validation#custom-validation-rules
Вы можете добавить к своему заказу InviteDeclineRequest
метод класса all
добавить id
к данным, которые будут проверены:
public function all()
{
$data = parent::all();
$segments = $this->segments();
$id = intval(end($segments));
if ($id != 0) {
$data['id'] = $id;
}
return $data;
}
а теперь в rules
Вы можете использовать это:
public function rules()
{
return [
'id' => ['required', 'exists:invites,id,status,pending']
];
}
чтобы убедиться, что редактируемая вами запись имеет статус pending
,
Других решений пока нет …