Laravel验证对象数组

时间:2018-01-18 17:03:31

标签: laravel

我想知道是否有可能在Laravel中验证一系列对象? 我使用vue构建了一个看起来像excell页面的表单,因此用户可以编辑许多以后上传的行。

我希望在发布到我的控制器时验证的数据如下所示:

rows[
0 {
  title: "my title",
  post: "my post text"
},
1 {
 title: "my title",
  post: "my post text"
},
2 {
 title: "my title",
  post: "my post text"
}
]

例如,我如何为每个输入添加必需的规则?

3 个答案:

答案 0 :(得分:1)

您可以使用Laravel的数组验证。

例如

$validator = Validator::make($request->all(), [
    'row.*.title' => 'required',
    'row.*.post' => 'required',
]);

您可以找到有关Laravel阵列验证here

的更多信息

答案 1 :(得分:0)

如果您发布一个数组,则可以使用批准的答案,但是,要进一步进行操作,我需要保存多个数组。如果我创建两个单独的端点,则该方法可行,但如果要将所有内容保存在一个DB::transaction中,该怎么办?

中提琴:

POST:
{
"array1": [
    { "key1": "string", "key2": 1 },
    { "key1": "string", key2": 0 }
  ],
"array2": [
    { "key3": "string", "key4": 1 },
    { "key3": "string", "key4": 0 }
  ]
}

SERVER:
$this->validate($request, [
    'array1' => 'present|array',
    'array2' => 'present|array',
    'array1.*.key1' => 'required|string',
    'array1.*.key2' => 'required|integer',
    'array2.*.key3' => 'required|string',
    'array2.*.key4' => 'required|integer'
]);

DB::transaction(function() use($request) {
    foreach($request['array1'] as $x){
        ...do stuff here
    };
});

注意:'present|array'接受空数组,而'required|array'拒绝它们。

答案 2 :(得分:0)

如果数组的元素是关联数组,Laravel 验证工作正常,但如果它们是对象,它就会失败,有时您希望将数据保留为对象以供进一步操作。

我创建了以下自定义规则

<?php

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;
use Illuminate\Support\Facades\Validator;

/**
 * Valida in arreglo de objetos
 * 
 * Si bien Laravel puede validar arrays, solo funciona
 * si sus elementos son arreglos asociativos, cuando son 
 * objetos la regla no se aplica
 */
class ArrayOfObjects implements Rule
{
    /**
     * Reglas de validacion
     */
    private array $rules;

    /**
     * Mensaje de error
     */
    private string $error;

    /**
     * Create a new rule instance.
     *
     * @return void
     */
    public function __construct(array $rules)
    {
        $this->rules = $rules;
    }

    /**
     * Determine if the validation rule passes.
     *
     * @param  string  $attribute
     * @param  mixed  $value
     * @return bool
     */
    public function passes($attribute, $value)
    {
        foreach ($this->rules as $property => $property_rules)
        {
            $rules = [$property => $property_rules];

            if (isset($value->{$property}))
            {
                $data = [$property => $value->{$property}];

                $validator = Validator::make($data, $rules);

                if ($validator->fails())
                {
                    $this->error = $validator->errors()->first($property);

                    // Detener el loop si hay un error
                    return false;
                }
            }
            else
            {
                if (in_array('required', $property_rules))
                {
                    $this->error = __('validation.required', ['attribute' => $property]);

                    return false;
                }
            }
        }

        return true;        
    }

    /**
     * Get the validation error message.
     *
     * @return string
     */
    public function message()
    {
        return $this->error;
    }
}

以控制器为例

public function store (Request $request)
{
  $object_rules = [
    'attr_1' => ['required', 'string'],
    'attr_2' => ['required', 'numeric']
  ];

  $request->validate([
    'array.*' => new ArrayOfObjects($object_rules)
  ]);
}