如何在 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)个字段需要验证(name
andanother field
),这里唯一的选择是对规则做一个条件语句,对吗?
@NathanSiafa 是的,您还可以使用required_if
验证规则来检查另一个字段的值。但是,字段总是name
和value
,不是吗?
@lepeino 非常感谢。你花了我一点钱,但这是值得的。以上是关于如何在 laravel 中验证 X-editable 请求(服务器端)的主要内容,如果未能解决你的问题,请参考以下文章
如何在 laravel 5.2 中使用多重身份验证 [关闭]