为了验证表单验证规则,我目前将它们存储在用户模型中,并在注册控制器,管理面板中的用户控制器,API中的用户控制器以及其他一些地方使用它们,但是目前很难维护,因为每个控制器都需要一点不同的规则集,当我在用户模型中更改规则时,其他控制器将不再起作用。那么如何避免规则重复并保持代码可维护性呢?
答案 0 :(得分:0)
我经常使用的方法是为模型编写一个HasRules
特征,它看起来像这样:
trait HasRules
{
public static function getValidationRules(): array
{
if (! property_exists(static::class, 'rules')) {
return [];
}
if (func_num_args() === 0) {
return static::$rules;
}
if (func_num_args() === 1 && is_string(func_get_arg(0))) {
return array_get(static::$rules, func_get_arg(0), []);
}
$attributes = func_num_args() === 1 && is_array(func_get_arg(0))
? func_get_arg(0)
: func_get_args();
return array_only(static::$rules, $attributes);
}
}
看起来很杂乱,但是它的作用是使您可以通过多种方式(如果存在静态字段,则从静态字段中)检索规则。因此,在您的模型中,您可以:
class User extends Model
{
use HasRules;
public static $rules = [
'name' => ['required'],
'age' => ['min:16']
];
...
}
然后在您的验证中(例如,在FormRequest
的{{1}}方法中或在准备规则数组时在控制器中),可以通过多种方式调用此rules()
:< / p>
getValidationRules()
不要害怕编写一些代码来生成您的自定义控制器特定规则。使用 $allRules = User::getValidationRules(); // if called with no parameters all rules will be returned.
$onlySomeRules = [
'controller_specific_field' => ['required'],
'name' => User::getValidationRules('name'); // if called with one string parameter only rules for that attribute will be returned.
];
$multipleSomeRules = User::getValidationRules('name', 'age'); // will return array of rules for specified attributes.
// You can also call it with array as first parameter:
$multipleSomeRules2 = User::getValidationRules(['name', 'age']);
和其他帮助程序,实现自己的帮助(例如,将array_merge
值添加到数组的帮助程序(如果不存在则将其删除)。我强烈建议您使用'required'
类来封装该逻辑。
答案 1 :(得分:0)
您可以尝试使用laravel的验证laravel documentation
使用和维护它真的很容易,只需执行以下步骤:
运行工匠命令:php artisan make:request StoreYourModelName
它将在App/Http/Requests
在授权功能中将其设置为:
public function authorize()
{
return true;
}
然后在规则函数中编写验证逻辑:
public function rules()
{
return [
'title' => 'required|unique:posts|max:255',
'body' => 'required',
];
}
自定义错误消息将其添加到您的规则函数下方:
public function messages()
{
return [
'title.required' => 'A title is required',
'body.required' => 'A message is required',
];
}
最后要在控制器中使用它,只需将其添加为函数中的参数即可。
public function create(Request $request, StoreYourModelName $storeYourModelName)
{
//
}
这就是您要做的全部工作,如果验证通过,它将在表单提交时进行验证,将验证发给您的控制器,请记住,您的验证逻辑不必像我的那样,我会向您展示一种验证方式完成..