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

Posted

技术标签:

【中文标题】如何在 laravel 中验证 X-editable 请求(服务器端)【英文标题】:How to validate X-editable request in laravel (Server side) 【发布时间】:2017-11-30 12:46:08 【问题描述】:

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

这里的想法是我发送三个键值对:

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 );
 

所以就好像我没有将“正确的”请求对象传递给 validate()?没有表单提交,但是the documentation明确表示:

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";
        
     
);

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

【问题讨论】:

我在理解您的问题时遇到了一些问题。您的值是否正确发送?但是验证没有“正确”运行?是最大长度吗?主语关系? "trying to fail it" 有什么? @Henry name 字段是唯一的,当我尝试插入一个已经存在的名称时,它会通过验证可能导致内部错误。通常,当我发送没有 x-editable 的 ajax 请求并尝试使验证失败时,我会通过 json 返回错误消息,我会捕获并将其显示给用户。 【参考方案1】:

如果我没记错的话,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 还会在响应中返回对象的 JSON 表示形式。)

【讨论】:

如果控制器有两(2)个字段需要验证(nameandanother field),这里唯一的选择是对规则做一个条件语句,对吗? @NathanSiafa 是的,您还可以使用required_if 验证规则来检查另一个字段的值。但是,字段总是namevalue,不是吗? @lepeino 非常感谢。你花了我一点钱,但这是值得的。

以上是关于如何在 laravel 中验证 X-editable 请求(服务器端)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Laravel 中验证数组?

如何在 laravel 5.2 中使用多重身份验证 [关闭]

如何在 laravel 中验证递归对象

如何在 laravel 中验证多行表单

在 Laravel 5 中使用表单请求验证时如何添加自定义验证规则

如何在 Laravel 5 中验证 RESTful API?