Lumen 无法设置自定义验证规则



我尝试使用此代码设置自定义验证消息,但没有效果-

class TestController extends Controller
{
    public function submit(Request $request)
    {
        $this->validate($request,
            [
                'items' => 'required'
            ],
            [
                'items.required' => 'test test'
            ]
        );
    }
}

但在错误的情况下,我得到了这个回应-

{
  "error": "The given data failed to pass validation."
}

这个代码怎么了?

UPD:

早些时候,我编辑AppExceptionsHandler,将错误(在API响应中)放入特定格式-

{
  "error": "123"
}

此代码是验证错误未显示的原因-

public function render($request, Exception $e)
{
    return response([
        'error' => $e->getMessage()
    ], 500);
}

我为此更新了Handler::render方法

public function render($request, Exception $e) {
    $response = parent::render($request, $e);
    if (isset($response->exception) and !empty($response->exception)) {
        return response(['error' => $response->exception->getMessage()], 500);
    } else {
        return parent::render($request, $e);
    } 
}

但我认为我需要改进这个代码。

似乎混合了验证rulesmessagesvalidate方法采用3个参数:requestrulesmessages

请尝试这个:

public function submit(Request $request)
{
    $rules = [
        'items' => 'required',
        'otheritems' => 'required',
    ];
    $messages = [
        'items.required' => 'Error: Please enter something.',
        'otheritems.required' => 'Otheritems are also required',
    ];
    $this->validate($request, $rules, $messages);
}

最新的Lumen版本总是返回JSON,请参阅文档:

验证失败时,$this->validate帮助程序将始终返回带有相关错误消息的JSON响应。如果你没有构建一个只发送JSON响应的无状态API,你应该使用完整的Laravel框架。

关于error的更新:Lumen给出的结果是这样的。

{"items":["Items are required"],"otheritems":["Otheritems are also required"]}

每个未通过验证的项目都会在响应中得到一个条目。所以你的error包,需要是一个JSON数组。

自定义异常render方法:

public function render($request, Exception $e)
{
    $response = parent::render($request, $e);
    if ($response->getStatusCode() == 422) {
        $renderResult = parent::render($request, $e);
        $returnResult['error'] = json_decode($renderResult->content(), true);
        $returnResult = json_encode($returnResult);
        return new Response($returnResult, $response->getStatusCode());
    } else {
        return parent::render($request, $e);
    }
}

最新更新