【问题标题】:Converting Laravel validation message dot syntax into array将 Laravel 验证消息点语法转换为数组
【发布时间】:2017-12-18 18:33:46
【问题描述】:

我在服务器端使用 Laravel。假设我们的控制器接收到两个字段url [string] 和data [array with index head]。我们可以验证数据并自定义错误消息

$this->validate($request, [

    'url' => 'required',
    'data.head' => 'required',

], [

    'url.required' => 'The :attribute field is required',
    'data.head.required' => 'The :attribute field is required',
]);

如果验证失败,Laravel 会返回带有 json 数据的响应

{
    "url": ["The url field is required"],
    "data.head": ["The data.head field is required"]
}

我们如何将响应数据转换为发送json,如下?

{
    "url": ["The url field is required"],
    "data": {
        "head": ["The data.head field is required"]
    }
}

【问题讨论】:

    标签: php laravel laravel-5


    【解决方案1】:
    key = key.replace(/\./g, '[') + Array(key.split('.').length).join(']');
    

    【讨论】:

    • 虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。
    【解决方案2】:

    在 JavaScript 中

    循环错误

    error: function (errors) {
        $.each(errors['responseJSON']['errors'], function (index, error) {
            var object = {};
            element = dotToArray(index);
            object[index] = error[0];
            validator.showErrors(object);
        });
    }
    

    将点表示法转换为数组表示法。即 abc.1.xyz 到 abc[1][xyz]

    function dotToArray(str) {
        var output = '';
        var chucks = str.split('.');
        if(chucks.length > 1){
            for(i = 0; i < chucks.length; i++){
                if(i == 0){
                    output = chucks[i];
                }else{
                    output += '['+chucks[i]+']';
                }
            }
        }else{
            output = chucks[0];
        }
    
        return output
    }
    

    【讨论】:

      【解决方案3】:

      我不知道这是否仍然是一个有效的问题,但要在 laravel 中使用点符号创建自定义验证,您可以在您的 validation.php 中指定这样的数组

      'custom' => [
              'parent' => [
                  'children' => [
                      'required' => 'custom message here'
                  ]
              ]
      

      这将是 parent.children 属性。

      再见。

      【讨论】:

        【解决方案4】:

        Laravel 有一个名为 array_set 的助手,可以将基于点的表示法转换为数组。

        我不知道你是如何通过 ajax 发送错误的,但你应该可以这样做:

        $errors = [];
        foreach ($validator->errors()->all() as $key => $value) {
          array_set($errors, $key, $value);
        }
        

        编辑: 但显然,您应该能够不使用Specifying Custom Messages In Language Files 的点符号,如下例所示:

        'custom' => [
            'email' => [
                'required' => 'We need to know your e-mail address!',
            ],
        ],
        

        【讨论】:

        • 我很困惑。为什么 Laravel 没有在响应中自动转换点语法?
        • 我编辑了,我的答案。我猜,Laravel 会保留您指定的格式。至少,这对我来说是有道理的,但之后看不到使用点符号的意义。
        • 感谢您的回答,我当然知道单独文件中的自定义消息,但这不是我的问题。我会在发回之前使用消息转换。
        • 对不起,我的意思是,如果你使用数组表示法,laravel 应该将错误消息作为数组返回。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-04-15
        • 2017-11-19
        • 1970-01-01
        • 2018-12-17
        • 1970-01-01
        • 1970-01-01
        • 2023-02-16
        相关资源
        最近更新 更多