首页 文章

如何在 laravel 中验证 X-editable 请求(服务器端)

提问于
浏览
0

我设法让 x-editable(https://vitalets.github.io/x-editable/)与页面一起工作,因为当我点击一个字段时,它显示内联并且我可以编辑它,并且我能够成功提交到 POST URI。

这里的想法是我发送三个 key-value 对:

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 对象传递给 validate()?没有表格提交,但文件明确指出:

Laravel 生成包含所有验证错误的 JSON 响应。此 JSON 响应将以 422 HTTP 状态发送 code.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";
        }
     }
});

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

1 回答

  • 2

    如果我没弄错的话,name是要编辑的字段(DB 列),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还返回 response.)中对象的 JSON 表示

相关问题