【问题标题】:Laravel Prevent duplicating form validation rulesLaravel 防止重复表单验证规则
【发布时间】:2016-08-17 22:17:24
【问题描述】:

我的应用中有很多不同的地方,用户可以在其中编辑他们的数据。更具体地说,我需要从注册开始(检查他们的用户名长度,是否需要某些字段等)并在他们登录时检查他们的数据(再次检查他们的用户名长度),从而使用用户数据验证表单。此外,当他们编辑他们的个人资料时,我需要检查他们的用户名最多可以包含多少个字符等。这只是开始。如果我有一个管理面板,我需要在那里做一个审核面板,我也需要在那里做。而不仅仅是用户名,可能还有他们的全名、头像 URL 等。

我无法为此创建一个请求文件,因为在注册时,只有大约 4 个字段,而在登录时有 2 个,在用户帐户设置中,大约有 10 个。所以请求文件在所有情况下都需要不同.

但是,验证规则(例如用户名)必须是 x 个字符并且必须是字母数字。并且密码需要最多 x 个字符等。这在所有不同的请求文件中非常重复。

如何在不重复所有验证规则的情况下最好地解决这个问题?

代码示例:

// LoginRequest.php

public function rules()
{
    return [
        'username' => 'required|max:16|min:6',
        'password' => 'required|max:16|min:6|alphanumeric'
    ];
}

// UserAccountSettingsRequest

public function rules()
{
    return [
        'username' => 'required|max:16|min:6|alphanumeric',
        'email'    => 'required|email',
        'name'     => 'required|max:100|min:2',
        'password' => 'required|max:16|min:6',
        'avatar'   => 'required|max:256'
    ];
}

// RegistrationRequest

public function rules()
{
    return [
        'username' => 'required|max:16|min:6|alphanumeric',
        'name'     => 'required|max:100|min:2',
        'email'    => 'required|email',
        'password' => 'required|max:16|min:6',
    ];
}

如您所见,我不得不多次重复许多规则。我怎样才能防止这种情况发生?

谢谢!

【问题讨论】:

    标签: php validation laravel


    【解决方案1】:

    考虑使用 php array_merge() 函数。

    您可以将常见的验证规则重构为一个新文件,并使用 composer.json 和 composer dump-autoload 自动加载它。 (PSR4 自动加载)

    比如validation_rules.php,可以写:

    $validation_rules_user_pwd=['username' => 'required|max:16|min:6|alphanumeric','password' => 'required|max:16|min:6'];
    

    当你需要使用它时,你可以这样做

    public function rules()
     {
         return array_merge($validation_rules_user_pwd,[
                  'email' => 'required|email',
                  'name' => 'required|max:100|min:2|,
                  'avatar' => 'required|max:256
                ]);
     }
    

    为了更进一步,你可以编写一个辅助函数,它接收一个字符串数组并返回一个关联数组。

    例如

    <?php
    namespace App\Helpers;
    
    class ValidationRulesBuilder
    {
        private static $validation_rules_preset = ["username" => "required|max:16|min:6|alphanumeric", "name" => 'required|max:100|min:2', 'email' => 'required|email', 'password' => 'required|max:16|min:6'];
    
        public static function buildValidationRules($fields)
        {
            $ret = [];
            foreach ($fields as $field) {
                $ret[$field] = self::$validation_rules_preset[$field];
            }
            return $ret;
        }
    }
    

    然后,使用它

     public function rules()
         {
             return (\App\Helpers\ValidationRulesBuilder::buildValidationRules(['username','password']));
         }
    

    【讨论】:

    • 谢谢。如果想要将附加规则传递给助手怎么办。像`return buildValidationRules(['username|min:3'])?我的意思是,有时我只想添加一个额外的?很好的答案,无论如何
    【解决方案2】:

    要允许附加规则,只需对构建函数进行一些修改,例如:

    <?php
    namespace App\Helpers;
    
    class ValidationRulesBuilder
    {
        private static $validation_rules_preset = ["username" => "required|max:16|min:6|alphanumeric", "name" => 'required|max:100|min:2', 'email' => 'required|email', 'password' => 'required|max:16|min:6'];
    
        public static function buildValidationRules($fields)
        {
            $ret = [];
            foreach ($fields as $field) {
                $pos = strpos($field, '|');
                if ($pos !== false) {
                    $ret[$field] = self::$validation_rules_preset[substr($field,0,$pos)]. substr($field, $pos);
                } else {
                    $ret[$field] = self::$validation_rules_preset[$field] ;
                }
            }
            return $ret;
        }
    }
    

    使用它:

     public function rules()
         {
             return (\App\Helpers\ValidationRulesBuilder::buildValidationRules(['username|min:5|custom-validation','password']));
         }
    

    password是默认规则,username是默认规则加上"min:5|custom-validation"

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-03
      • 1970-01-01
      • 2021-05-18
      • 2018-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-03
      相关资源
      最近更新 更多