我想知道是否有可能在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"
}
]
例如,我如何为每个输入添加必需的规则?
答案 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)
]);
}