【发布时间】:2015-05-05 16:25:40
【问题描述】:
我了解如何通过在控制器方法中输入类名来验证请求。但是对于 Ajax 请求,According to the documentation,我应该在控制器中验证数据,因为使用验证器类将重定向而不是发送响应。
我正在看的主要部分是:
如果传入请求是 AJAX 请求,则不会重定向 生成。相反,带有 422 状态代码的 HTTP 响应将是 返回到浏览器,其中包含验证错误的 JSON 表示形式。
但是,我的控制器如下:
public function update(App\Permission $permission, Request $request)
{
$this->validate($request, [
'permission_description' => 'required|string'
]);
...
}
而且我这辈子都无法让它用 JSON 响应。该文档指出,如果失败,则会引发Illuminate\Contracts\Validation\ValidationException 异常,但我无法捕捉到它。
每当它失败时,它总是重定向回编辑页面。显然我不想要这个,我想要json响应。
我刚刚尝试用整个$v = Validator::make($request->all(), ...);“手动写出来”,它确实有效,但是如果它不起作用,那么使用$this->validate() 方式有什么意义呢?
$this->validate() 方法是否不适用于 AJAX,我每次都必须写很长的路?难道我做错了什么?!
以下是我尝试过的:
public function update(App\Permission $permission, UpdatePermissionRequest $request)
{
/** Redirects rather than returns JSON if the validation fails **/
}
----------------------------------
public function update(App\Permission $permission, Request $request)
{
$this->validate($request, [
'permission_description' => 'required|string'
]);
/** AND I've also tried: **/
try {
$this->validate($request, ['permission_description' => 'required|string']);
} catch (\Illuminate\Contracts\Validation\ValidationException $e {
echo $e; /** Echoing for debug reasons **/
exit;
}
...
/** Still redirects the browser, even if it is an AJAX request **/
}
-----------------------------------------
use Validator;
...
public function update(App\Permission $permission, Request $request)
{
$v = Validator::make($request->all(), [
'permission_description' => 'required|string'
]);
if($v->fails())
{
return response()->json(['reply' => false]);
}
/** Works **/
}
更新
文档不正确。它指出$this->validate() 方法会抛出Illuminate\Contracts\Validation\ValidationException,但它不会。它会引发Illuminate\Http\Exception\HttpResponseException 异常。
【问题讨论】: