将当前字段的值传递给 Laravel 中的自定义验证函数

Posted

技术标签:

【中文标题】将当前字段的值传递给 Laravel 中的自定义验证函数【英文标题】:Passing the value of current field to custom validation function in Laravel 【发布时间】:2022-01-17 17:20:29 【问题描述】:

我想将当前字段的值传递给我的 Laravel 项目的 Request 类中的自定义验证函数。

我尝试了以下方法:

public function rules()

    return [
        'id'=>'required',
        //'type'=>'required|in:Attachment,Audio,Book,Picture,Video',
        'type'=>['required', $this->validateFileType()],
        //'type'=>[new Enum(FileType::class)], # only available on php 8.1+
        'soft_price' => 'numeric|min:1000',
        'hard_price' => 'numeric|min:1000',
    ];


public function validateFileType($type)

    $file_types = ['Attachment', 'Audio', 'Book', 'Picture', 'Video'];

    if(in_array($type, $file_types))
        return true;
    else
        return false;

我收到以下错误:

"Too few arguments to function App\\Http\\Requests\\FileUpdateRequest::validateFileType(), 0 passed in C:\\xampp\\htdocs..."

我该怎么做?

【问题讨论】:

【参考方案1】:

你应该看看Custom Validation Rules。

您可以使用 artisan 添加自定义规则类:

php artisan make:rule MyFileType

在其中,您可以访问当前值并输出自定义错误消息

public function passes($attribute, $value)

    $file_types = ['Attachment', 'Audio', 'Book', 'Picture', 'Video'];
    
    if(in_array($value, $file_types))
        return true;
    else
        return false;

您可以像这样在代码中使用它:

use App\Rules\MyFileType;

public function rules()

    return [
        ...
        'type' => ['required', new MyFileType],
        ...
    ];

【讨论】:

谢谢,虽然我不得不:in_array($value, $file_types) 对不起,我修好了。【参考方案2】:

创建新规则:

<?php

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;

class FileTypeRule implements Rule

    public function passes($attribute, $value)
    
        $file_types = ['Attachment', 'Audio', 'Book', 'Picture', 'Video'];

        if(in_array($file_types, $value))
           return true;
        else
           return false;
    

在请求规则方法中使用它:

public function rules()

    return [
        'id'=>'required',
        'type'=>['required', new FileTypeRule()],
        'soft_price' => 'numeric|min:1000',
        'hard_price' => 'numeric|min:1000',
    ];

【讨论】:

【参考方案3】:

您必须在规则函数中传递两个参数,有关更多信息,请查看laravel documentation

【讨论】:

以上是关于将当前字段的值传递给 Laravel 中的自定义验证函数的主要内容,如果未能解决你的问题,请参考以下文章

如何通过控制器将两个不同模型的值作为 Laravel 8 中的单个返回变量传递给视图文件

无法将选中的值从自定义复选框组件传递给父组件

将自定义道具传递给 TypeScript 中的 Redux 表单字段

将图像名称传递给 SwiftUI 中的自定义图像子类

如何将范围传递给 Google 电子表格中的自定义函数?

如何获取单选按钮的值并将其传递给 laravel 中的控制器?