【问题标题】:Laravel validator response nested arraysLaravel 验证器响应嵌套数组
【发布时间】:2016-08-21 01:32:16
【问题描述】:

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

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

organisation.name wold 返回错误:

{
  "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
};

有人能解释一下吗?

【问题讨论】:

  • 我也想知道这是否可能以及如何实现,好问题

标签: php json validation laravel vue.js


【解决方案1】:

我自己还没有这样做,但是看看docs 给个提示 -

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

您的语言文件

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

【讨论】:

    【解决方案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;
    }
    

    我们有一个名为 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;
    }
    

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

    【讨论】:

    • 对不起,我不明白,我和这段代码有什么关系?
    猜你喜欢
    • 2016-03-27
    • 2014-05-18
    • 2019-04-15
    • 2020-01-13
    • 2013-08-01
    • 2014-05-18
    • 2019-07-25
    • 2021-05-30
    • 1970-01-01
    相关资源
    最近更新 更多