При обновлении строки, как мне проверить, что существующая строка содержит значение с запросами формы Laravel?

В Laravel 5 использование запроса формы в качестве шлюза проверки и приведенный ниже код:

Контроллер

public function decline(Request $request, InviteDeclineRequest $validation, $id)
{
    $invite = Invite::find($id);
    $invite->status = 'declined';
    $invite->save();   
}

FormRequest

class InviteDeclineRequest extends Request {

    public function rules()
    {
        return [
            # this is referring to the incoming data, 
            # not the existing data 
            'status': 'pending', 
        ];
    }

}

Как я могу изменить приведенный выше набор правил проверки, чтобы сказать, что входящий ввод действителен только в том случае, если статус существующей записи установлен на «ожидает». То есть не разрешать отклоненное приглашение, если уже существующее не ожидает рассмотрения.

Вариант 1. Поместите эту логику в контроллер. Возможно, приведенное выше не считается частью проверки (хотя я бы сказал, что это так), и поэтому не относится к FormRequest.

Вариант 2. Поместите логику в метод авторизации метода FormRequest. Единственным недостатком этого является то, что авторизация должна быть для управления доступом, а не для проверки данных.

Вариант 3. Расширьте запрос формы, включив в него третий метод, который проверяет как существующие, так и входящие данные. Немного болезненно, так как мне нужно убедиться, что он вызывается как часть цикла запроса.

Вариант 4: добавьте настраиваемое правило проверки: http://laravel.com/docs/5.0/validation#custom-validation-rules


person Chris    schedule 18.04.2015    source источник


Ответы (1)


Вы можете добавить в свой собственный 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.

person Marcin Nabiałek    schedule 18.04.2015
comment
Вы можете получить доступ к параметру маршрута, например $this->id, и проверить их с помощью 'id' => 'required|exists:invites,id,status,pending' . $this->id. Подробнее об этом здесь. - person Mahozi; 18.04.2015