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