php Laravel 10 -验证规则“字符串或数组”

pgvzfuti  于 2023-11-16  发布在  PHP
关注(0)|答案(3)|浏览(163)

我需要为动态数组添加验证,该动态数组的元素可以是字符串或包含字符串的后续数组,但我找不到保存此规则的方法。
我当前的验证:

$data = $request->validate([
            'answers' => ['required', 'array'],
            'answers.*' => ['required', 'max:255'],
            'answers.*.*' => ['nullable', 'string', 'max:255']
        ]);

字符串
样品输入:

"answers" => array:3 [▼
    4 => array:1 [▼
      0 => "Tests"
      1 => "Tests 2"
    ]
    5 => "Test"
    6 => "Yes"
  ]

xxe27gdn

xxe27gdn1#

所以,我创造了一些东西,可能会解决你的问题,我已经尝试过了,工作。
首先,您可能希望创建一个新的Rule类,正如我在您的问题中所评论的,例如,可能使用artisan命令php artisan make:rule DynamicArray给它给予一个名称。
您需要在app/Rules/DynamicArray中执行以下操作:

public function validate(string $attribute, mixed $value, Closure $fail): void
{
    $this->checkArray($attribute, $value, $fail);
}

private function checkArray(string $attribute, mixed $value, Closure $fail): void
{
    if(!is_array($value)){
        $fail("The $attribute must be an array.");
        return;
    }

    foreach ($value as $element){
        if (is_array($element)) {
            $this->checkArray($attribute, $element, $fail);
        } else if (!is_string($element)) {
            $fail("The $attribute is invalid.");
            return;
        }
    }
}

字符串
然后在你的控制器中你会这样结束:

$data = $request->validate([
        'answers' => ['required', 'array', new DynamicArray]
    ]);

    dd($data);


你可以调试$data来检查它是否工作:

dd($data);


它将通过验证:
x1c 0d1x的数据
希望能解决你的问题!

cngwdvgl

cngwdvgl2#

创建自定义规则类。例如:NestedArrayWithStrings
然后检查:

if (is_array($item))

字符串
在ForLoop中等等。
像这样添加到验证:

'answers' => ['required', 'array', new NestedArrayWithStrings],

vdzxcuhz

vdzxcuhz3#

你需要在Laravel中定义一个自定义规则。

  • 运行命令php artisan make:rule NestedArrayWithStrings,这将在App\Rules目录中创建一个新文件。
  • 要添加此规则,请首先在控制器中导入规则类名称空间。
use App\Rules\NestedArrayWithStrings;

字符串

  • 现在,在你的验证器中使用它:
$v = Validator::make($request->all(),[
        'answers' => [
            'required',
            'array',
            new NestedArrayWithStrings
        ]
    ]);

if($v->fails()){
    echo $v->errors()->first(); // or similar
}


下面将是你的递归代码来判断值,如果它通过:

<?php

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;

class NestedArrayWithStrings implements Rule{
    /**
     * Determine if the validation rule passes.
     *
     * @param  string  $attribute
     * @param  mixed  $value
     * @return bool
     */
    public function passes($attribute, $value){
        if(!is_array($value)) return false;
        foreach($value as $v){
            if(is_array($v)){
               if(!$this->passes($attribute, $v)){
                 return false;
               }
            }else if(!is_string($v)){
                return false;
            }
        }

        return true;
    }

    /**
     * Get the validation error message.
     *
     * @return string
     */
    public function message(){
        return 'Answers can only contain arrays filled with strings.';
    }
}

**注意:**从技术上讲,前端提供的所有内容都将以字符串形式出现,因此您需要沿着is_string以过滤出您希望拥有的数据类型。

相关问题