【问题标题】:How do I define validation rules in laravel 8 globally?如何在 laravel 8 中全局定义验证规则?
【发布时间】:2021-12-23 10:48:24
【问题描述】:

我考虑过在一个类中为我的应用程序的不同部分定义验证规则作为静态变量。例如,

$VALIDATION_RULES = [
    'signatures' => [
        'first_name' => ['required', 'max:255', 'required','string'],
        'last_name' => ['required', 'max:255', 'required', 'string'],
        'enabled' => [ 'required', Rule::in(['on', 'off']) ],
        'signature_file' => ['required', 'mimes:png,jpeg,jpg', 'max:1024'],
        'operator_id' => ['required', 'numeric'],
    ],
];

但是,我得到了这个错误。

Symfony\Component\ErrorHandler\Error\FatalError
Constant expression contains invalid operations

这是由于

与任何其他 PHP 静态变量一样,静态属性只能是 在 PHP 5.6 之前使用文字或常量初始化;表达式 不允许。在 PHP 5.6 及更高版本中,适用与 const 相同的规则 表达式:一些有限的表达式是可能的,只要它们可以 在编译时进行评估。

根据php官方文档。 这样做的正确方法是什么?

P.S.:这个变量在类中定义为公共和静态成员。在代码中,无论我需要验证输入,我都可以调用

$validated_input = $request->validate($VALIDATION_RULES['signatures']);

这样,我可以将所有规则集中在一个类中。

【问题讨论】:

  • 您可以使用全局范围,它将执行每个模型请求。
  • 你在哪里定义了$VALIDATION_RULES。你能分享整个文件吗
  • 你想拥有一部分代码并在其他 FormRequests 中也使用它吗?
  • 我建议您创建自己的验证器模型或 FormRequest,您可以使用它来扩展其他验证器或表单请求
  • @ManojKiranAppathurai 在类中作为公共静态变量

标签: php laravel


【解决方案1】:

如果您想拥有代码的一部分并在其他 FormRequests 中也使用它,您可以使用特征。

假设您要在多个 FormRequests 中验证用户:

创建UserRequestTrait 并将此方法添加到特征中:

private function userInfoValidator(string $prefix = ''): array
{
    return [
        $prefix . 'first_name' => ['required', 'string', 'max:100'],
        $prefix . 'last_name' => ['required', 'string', 'max:100'],
    ];

}

现在您可以在 FormRequest 类中使用它了:

class UserFormRequest extends FormRequest
{
    use UserRequestTrait;


    public function rules()
    {

        $rules = [
          // Add the other rules
        ];

        // validate user info
        $userValidation = $this->userInfoValidator();

        return array_merge(
            $rules,
            $userValidation
        );
    }
}

如果你正在验证一个对象,你可以在userInfoValidator方法中添加前缀,像这样:

$userValidation = $this->userInfoValidator('users.*.');

【讨论】:

    【解决方案2】:

    你不能在声明类属性时使用functions,expressions,objects(包括staticnon-static属性)。这意味着你不能在属性内调用someFunction()new Sampleclass,你只能使用静态值。您必须在 constructor 或其他方法中以不同方式添加这些值。

    所以通过删除属性内的Rule::in(['on', 'off'])(即object)将解决问题

        class MyTestClass {
      
      public $VALIDATION_RULES = [
        'signatures' => [
            'first_name' => ['required', 'max:255', 'required','string'],
            'last_name' => ['required', 'max:255', 'required', 'string'],
            'enabled' => [ 'required'],
            'signature_file' => ['required', 'mimes:png,jpeg,jpg', 'max:1024'],
            'operator_id' => ['required', 'numeric'],
        ],
    ];
        
    }
    
    $obj = new MyTestClass;
    dd($obj);
    

    您可以阅读文档

    https://php-legacy-docs.zend.com/manual/php5/en/language.oop5.static

    【讨论】:

      猜你喜欢
      • 2017-12-01
      • 2021-10-25
      • 2017-04-11
      • 2018-02-18
      • 2014-04-22
      • 2019-02-12
      • 2016-11-22
      • 2015-08-05
      • 1970-01-01
      相关资源
      最近更新 更多