Laravel 验证器响应嵌套数组

And*_*gan 5 php validation json laravel vue.js

是否可以扩展来自嵌套数组的验证器响应。通常 Laravel 用“点符号”响应,例如:

    [
        'organisation.name'          => 'required|max:60|min:3',
        'organisation.avatar'        => '',
        'organisation.phone'         => 'required|max:25|min:5',
        'organisation.paid_staff'    => 'required|numeric'
    ]
Run Code Online (Sandbox Code Playgroud)

wold 返回错误organisation.name

{
  "message": "422 Unprocessable Entity",
  "errors": {
    "organisation.name": [
      "The organisation name has already been taken."
    ]
  },
  "statusCode": 422
};
Run Code Online (Sandbox Code Playgroud)

我希望将点符号扩展为这样:

{
  "message": "422 Unprocessable Entity",
  "errors": {
    "organisation": {
        "name": [
            "The organisation name has already been taken."
        ]
    }
  },
  "statusCode": 422
};
Run Code Online (Sandbox Code Playgroud)

谁能阐明这一点?

And*_*gan 2

我们通过扩展App\Exceptions\Handler类方法来实现这一结果invalidJson(),如下所示:

/**
 * Convert a validation exception into a JSON response.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Illuminate\Validation\ValidationException  $exception
 * @return \Illuminate\Http\JsonResponse
 */
protected function invalidJson($request, ValidationException $exception)
{
    $jsonResponse = parent::invalidJson($request, $exception);

    $original = (array) $jsonResponse->getData();

    $jsonResponse->setData(array_merge($original, [
        'statusCode'    => $exception->status,
        'errors'        => Arrays::expandDotNotationKeys((array) $original['errors']),
    ]));

    return $jsonResponse;
}
Run Code Online (Sandbox Code Playgroud)

我们有一个实用程序类,Arrays其方法expandDotNotationKeys()如下所示:

/**
 * Expands arrays with keys that have dot notation
 *
 * @param Array $array
 *
 * @return Array
 */
public static function expandDotNotationKeys(Array $array)
{
    $result = [];

    foreach ($array as $key => $value) {
      array_set($result, $key, $value);
    }

    return $result;
}
Run Code Online (Sandbox Code Playgroud)

完毕!无需更改母语文件。