使用JSON.stringify传递单个数据时进行验证

时间:2018-09-05 09:52:03

标签: laravel

在将数据传递到Controller之前,正在添加数据:

formData.push({"name":"channels","value":JSON.stringify(channels)});

即使没有数据也是如此,它的传递就像     'channels'=>'[]'

现在的问题是,当我尝试在验证器中对此进行验证时,我无法使用      'channels'=>'required',      'channels。*'=>'required | exists:channels,id',

如何验证上述数据?不想将格式转换为其工作系统。任何建议表示赞赏。谢谢。

已更新以请求所有参数:     '_token' => 'DjqgmNab0o3ifrVrSvHh6dM5vxLP7tZDc47pq05r', 'startdate' => '05 Sep 2018', 'years' => NULL, 'months' => NULL, 'enddate' => NULL, 'addChannel' => NULL, 'offerRuns' => 'UL', 'numberOfRuns' => NULL, 'limitPeriod' => 'FP', 'licenseAudioTrack' => '1', 'amount' => NULL, 'include_materials_costs' => '1', 'include_withholding_taxes' => '1', 'paymentTermsType' => 'US', 'termsAndConditionDescription' => NULL, 'document_s3_url' => NULL, 'file' => NULL, 'fileSize' => NULL, 'materialSpecificationDescription' => NULL, 'note' => NULL, 'countries' => '[]', 'platforms' => '["1","2","3","4","5","6","7","8","9"]', 'platforms-exclusive' => '[]', 'platforms-non-exclusive' => '[]', 'platforms-holdback' => '[]', 'channels' => '[]', 'languages' => '[["56","AL",1,"seller"]]', 'currencySelectedTerm' => 'EP', 'currencyId' => '1', 'paymentTerms' => '[]'

3 个答案:

答案 0 :(得分:0)

检查当前的验证规则。它指出:

  

出席

     

验证中的字段必须存在于输入数据中,但可以   为空。

有时还会考虑规则:

  

在某些情况下,您可能希望针对   仅当输入数组中存在该字段时,才可以使用该字段。要快   为此,请将有时会的规则添加到您的规则列表中

https://laravel.com/docs/5.7/validation#conditionally-adding-rules

答案 1 :(得分:0)

据我了解,channels是作为JSON字符串传递的,并且required验证程序不起作用,因为它不是空字符串。

您可以创建一个自定义验证器来验证空的JSON字符串并使用它。

<?php

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;

class JsonRequired implements Rule
{
    /**
     * Determine if the validation rule passes.
     *
     * @param  string  $attribute
     * @param  mixed  $value
     * @return bool
     */
    public function passes($attribute, $value)
    {
        return ! empty(json_decode($value, true));
    }

    /**
     * Get the validation error message.
     *
     * @return string
     */
    public function message()
    {
        return 'The :attribute is required.';
    }
}

并将其用作'channels' =>'new JsonRequired'

如果整个应用程序只需要使用一次,则可以使用闭包代替规则对象。

Laravel custom validation

答案 2 :(得分:0)

您可以先将json_decode用于数据,然后再应用验证

public function store(Request $request)
{
    $request_data = $request->all();

    foreach($request_data as $key=>$value)
    {
        $request_data[$key] = json_decode($value);
    }

    // And then pass data in validator rules

    $rules = [
       // All rules here
    ];

    $validator = Validator::make($request_data, $rules);
    // other code
}