如何避免Laravel验证规则中的重复

时间:2019-06-10 06:21:47

标签: php laravel validation design-patterns duplicates

为了验证表单验证规则,我目前将它们存储在用户模型中,并在注册控制器,管理面板中的用户控制器,API中的用户控制器以及其他一些地方使用它们,但是目前很难维护,因为每个控制器都需要一点不同的规则集,当我在用户模型中更改规则时,其他控制器将不再起作用。那么如何避免规则重复并保持代码可维护性呢?

2 个答案:

答案 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)
{
  //
}

这就是您要做的全部工作,如果验证通过,它将在表单提交时进行验证,将验证发给您的控制器,请记住,您的验证逻辑不必像我的那样,我会向您展示一种验证方式完成..