Laravel防止重复表单验证规则

时间:2016-04-24 15:21:44

标签: php validation laravel

我的应用中有很多不同的地方,用户可以编辑他们的数据。更具体地说,我需要通过从注册开始(检查用户名长度,如果需要某些字段等)来验证表单和用户数据,并在登录时检查他们的数据(再次检查他们的用户名长度)。此外,当他们编辑他们的个人资料时,我需要检查他们的用户名可以有多少个最大字符,等等。这只是一个开始。如果我有一个管理面板,我需要在那里做一个审核面板,我也需要那样做。而且不仅仅是用户名,可能还有他们的全名,头像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',
    ];
}

正如你所看到的,我不得不多次重复许多规则。我该如何防止这种情况?

谢谢!

2 个答案:

答案 0 :(得分:1)

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

<?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"

答案 1 :(得分:0)

考虑使用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
            ]);
 }

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

E.g。

<?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']));
     }