是否有 Laravel 验证规则来检查字段是否为标量

Is there a Laravel validation rule that checks if a field is scalar

我正在使用 Laravel 的验证器来验证控制器内的 JSON 请求:

class InsertProduct extends ModuleApiController
{
    public function handle(Request $request, int $fileId)
    {
        $data = $request->json()->all();

        $validator = Validator::make($data, [
            'products' => ['required', new ArrayWithType('seq', 'The :field field must be an array')],
            'products.*' => ['required', new ArrayWithType('assoc', 'The :field field must be an object')],
            'products.*.code' => 'required|alpha_num',
            'products.*.variants' => ['required', new ArrayWithType('seq', 'The :field field must be an array')],
            'products.*.variants.*' => ['required', new ArrayWithType('assoc', 'The :field field must be an object')],
            'products.*.variants.*.barcode' => 'required|alpha_num',
        ]);

products.*.code 字段和 products.*.variants.*.barcode 字段可以是这样的:

20032199231
"AB3123-X"
"Z22.327p"
"001230572"
"Houston22"

我似乎无法找到一条规则来接受所有这些潜在值,但拒绝数组或对象(关联数组一旦 Laravel 解析 JSON)值。

我尝试过的事情:

 Rule                 | Issue
----------------------|--------------------------------------------------------------------
'required'            | Will validate JSON objects and arrays 
'required|string'     | Won't validate integer values like the first one above
'required|alpha_num'  | Won't validate the middle three values above
'required|alpha_dash' | Won't validate values that contain periods (.) like the third one

我需要的是:'required|not_array''required|scalar' 但我无法在文档中找到类似的内容。

我真的必须为此编写自定义验证规则吗?

没有这样的 built-in 验证规则。您需要创建自定义验证规则(参见 docs). Use regex rule (see docs)才能实现它。

你尝试过这样的事情吗?使用 is_scalar

$validator = Validator::make($request->all(), [
    'products.*.code' => [
        'required',
        function ($attribute, $value, $fail) {
            if (!is_scalar($value)) {
                $fail($attribute.' isnt a scalar.');
            }
        },
    ],
]);

或者,如果您想注册自定义验证:

public function boot()
{
     Validator::extend('is_scalar', function ($attribute, $value, $parameters, $validator) {
         return !is_scalar($value);
     });
 }

然后:

$validator = Validator::make($request->all(), [
    'products.*.code' => [
        'required',
        'is_scalar'
    ],
]);