Как проверить X-редактируемый запрос в laravel (на стороне сервера)

Мне удалось получить x-editable ( https://vitalets.github.io/x-editable/ ) для работы со страницей, поскольку, когда я нажимаю на поле, он отображает строку, и я могу ее редактировать , и я могу успешно подать на URI POST.

Идея здесь в том, что я отправляю три пары ключ-значение:

array:3 [▼ "name" => "name" "value" => "mathematics" "pk" => "1" ] 

и мой метод update() ловит массив, и он успешно обновляет запись в базе данных. Но я не могу проверить данные.

Так выглядит мой контроллер:

  public function update(Request $request) { // $id = $request->pk; $subject = Subject::findOrFail($id); $rules = array ( 'name' => 'bail|required|max:20|unique:subjects,name,'.$id ); 

Эта проверка проходит легко, даже если я пытаюсь ее провалить

  $validator = Validator::make ( $request->all(), $rules ); if ($validator->fails ()) { return response()->json ( array ( 'errors' => $validator->getMessageBag ()->toArray () ) ); } else { $subject->update([$request->name => $request->value]); } return response ()->json ( $subject ); } 

Итак, я как-то не передаю «правильный» объект Request для проверки ()? Форма представления отсутствует, но в документации четко указано, что:

Laravel генерирует ответ JSON, содержащий все ошибки проверки. Этот ответ JSON будет отправлен с кодом состояния 422 HTTP. 1

Маршрут:

 Route::post('/subjects/update/', 'SubjectsController@update'); 

сценарий:

 $('#subjects').editable({ container:'body', selector:'td.name', type:'post', dataType:'JSON', validate:function(value){ if ($.trim(value) === '') { return "Field is required"; } } }); 

1 https://laravel.com/docs/5.4/validation#quick-ajax-requests-and-validation

Если я не ошибаюсь, name – это поле для редактирования (столбец БД), а value – это нулевое значение. Похоже, вы обновляете столбец name , поэтому вам нужно проверить уникальность value в запросе, а не «имя».

Кроме того, я бы предложил вам использовать метод validate вашего контроллера (предоставляемый с помощью ValidatesRequests ):

 public function update(Request $request) { $id = $request->pk; $subject = Subject::findOrFail($id); $this->validate($request, [ 'name' => 'required', // this should be the column to update 'value' => 'bail|required|max:20|unique:subjects,name,'.$id ]; $subject->update([$request->name => $request->value]); return $subject; } 

Здесь validate будет автоматически отклоняться с кодом 422 и ошибками проверки в ответе JSON. Если он пройдет, он продолжит обновление. ( return $subject также возвращает JSON-представление объекта в ответе.)