我对名为user_id
的字段有以下规则。
"rules" => ["zero_to_null", "integer", "min:1", "exists:app_users,id"],
user_id
可以为空,因此它可以是null
或1,2,3,etc.
当用户在浏览器中选择“0”时,我想在数据库中将其设置为null
。
我可以只使用规则吗?
如果zero_to_null
规则通过(如果值等于'0'),则不检查所有其他规则。
Validator::extend("zero_to_null", function($attribute, $value, $parameters, $validator) {
if($value === "0") {} // do something
});
P.S。用户发送POST请求0
值,并且必须在数据库中将其设置为NULL
。关于规则的问题仅,而不是像setUserIdAttribute($value)
这样的问题。字段始终存在于请求中,因此sometimes
规则无法帮助我。
使用跨应用程序的通用函数验证模型。
public static function createValidatorForModel($cls, $data) {
$rules = $cls::getFieldsRules();
$validator = Validator::make($data, $rules);
$validator->setAttributeNames($cls::getFieldsLabels());
return $validator;
}
getFieldsRules
会返回$cls
示例电话:
$validator = ModelValidationHelper::createValidatorForModel(User::class, $request->all());
答案 0 :(得分:0)
你不应该混淆这样的顾虑。验证规则应仅执行验证。
如果你有可为空的字段,你可以通过类似this之类的东西传递空值,或者让你的控制器改变必要的数据。当然,强制将底层数据库结构放入外部输入并不总是可行的,在这种情况下,控制器应该将输入数据从预期输入格式变为基础模型结构。
这也意味着您不应盲目地将$request->all()
的结果传递给您的数据库。虽然可以验证数据并且查询参数绑定将保护您的应用程序免受sql注入,但它对于包含比您希望在特定请求期间处理的字段多的字段的伪造请求无效。意外的字段也将避免任何类型的验证。
相反,你的路由处理程序(闭包,控制器方法等)应该明确它想要处理的字段:
public function action(Request $request)
{
/* Create Validator for this action */->validate();
$data = $request->only('fields', 'that', 'you', 'expect', 'to', 'handle');
/* Transform $data from input format to db format */
Model::create($data);
}
虽然让模型决定自己的验证规则就像你使用createValidatorForModel
方法所做的一样,但是这种方法在针对模型的不同行为有不同的限制时会分崩离析,这也是值得的。例如,管理员用户可以编辑比非管理员用户更多的字段。此外,验证和预期字段列表的分离使得更难发现验证中的差距。