Laravel验证器响应嵌套数组


Laravel validator response nested arrays

是否可以从嵌套数组扩展验证器响应。通常,Laravel以"点符号"作为回应,例如:

    [
        'organisation.name'          => 'required|max:60|min:3',
        'organisation.avatar'        => '',
        'organisation.phone'         => 'required|max:25|min:5',
        'organisation.paid_staff'    => 'required|numeric'
    ]

organisation.name错误将返回:

{
  "message": "422 Unprocessable Entity",
  "errors": {
    "organisation.name": [
      "The organisation name has already been taken."
    ]
  },
  "statusCode": 422
};

我想将点符号扩展为这样的地方:

{
  "message": "422 Unprocessable Entity",
  "errors": {
    "organisation": {
        "name": [
            "The organisation name has already been taken."
        ]
    }
  },
  "statusCode": 422
};

谁能阐明这一点?

我们通过扩展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;
}

我们有一个名为 Arrays 的 Utility 类,其方法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;
}

完成!无需更改本地语言文件。

我自己还没有这样做,但查看文档给出了一个提示 -

在许多情况下,您可能希望指定特定于属性的自定义 语言文件中的消息,而不是将它们直接传递给 验证器。为此,请将消息添加到 resources/lang/xx/validation.php 语言文件。

您的语言文件

'custom' => [
    'organisations' => [
        'name' => [
             'required' => 'The organisation name has already been taken!',
        ],
    ],
],