Laravel:模型内的验证。多重验证规则

Posted

技术标签:

【中文标题】Laravel:模型内的验证。多重验证规则【英文标题】:Laravel: Validation within model. Multiple Validation rules 【发布时间】:2014-06-26 14:42:20 【问题描述】:

如何向模型添加多个验证规则?

我创建了一个 BaseModel,其中 BaseModel 扩展了 Eloquent。 我的其他模型扩展了 BaseModel。

模型/基础模型

class BaseModel extends Eloquent 
public $errors;

public function validate($data) 

    $validation  = Validator::make($data, static::$rules);

    if($validation->passes()) 
        return true;
    

    $this->errors = $validation->messages();

    return false;

模型/用户

    protected static $rules = [
    'email_address' => "required|email|unique:users,email_address",
    'first_name' => "required",
    'last_name' => "required",
    'password' => "required|min:6|same:confirm_password",
    'confirm_password' => "required:min:6|same:password",

];

以上规则适用于注册页面。

现在我的登录页面也将通过用户模型。

它应该验证电子邮件地址和密码。

是否可以为模型添加多个验证规则。

我确信我可以让 $rules 成为一个变量,它通过了验证函数,但这看起来并不干净。 例如

模型/基础模型

public function validate($data, $rules) 

【问题讨论】:

登录时验证不是模型工作。把它留给别的东西,因为模型应该只负责(如果你想要的话)创建一个新记录。验证登录凭据是另一回事,实际上您根本不需要它。除非有你想分享的理由? 我没有验证登录,我正在尝试使用多个验证规则。 【参考方案1】:

我通过将$rules 一起存储在我的模型方法中解决了这个问题。在此示例中,我正在验证用户更新。我在这个类中使用了一个 validate 类方法。事情可以组织得更好,但我正在努力。

这是来自我的 EloquentUserRepositoryUser 模型的代码,但我使用存储库。

EloquentUserRepository:

public function update($user) 
    $rules = array(
        "email" => "required|email",
        "userrole" => "required"
    )
    if($this->validate(Input::all(), $rules)) 
        $user->save();
        return true;
     else 
        return false;
    


private function validate($data, $rules) 
    $validator = Validator::make($data, $rules);
    if($validator->passes()) 
        return true;
     else 
        $this->errors = $validator->errors();
        return false;
    


public function errors() 
    return $this->errors()->all();

这很好用,让我的控制器保持清洁,并在有意义的地方显示我的验证规则。

【讨论】:

【参考方案2】:

也许您可以尝试各种类型的验证功能 例如: $User->validateUpdate 然后在你的用户模型中

private function validateUpdate($data)
    $validator = Validator::make($data, $this->updateRules);
    if($validator->passes()) 
         return true;
     else 
        $this->errors = $validator->errors();
        return false;
    


public function errors() 
    return $this->errors()->all(); 

【讨论】:

【参考方案3】:

我知道已经很久了,但如果有人想要更多答案,请回答

class LaravelValidation implements UsersValidation

    /**
     * Validate user inputs
     *
     * @param  array  $data
     * @return bool
     *
     * @throws \Illuminate\Validation\ValidationException
     */
    public function validate(array $data, $method='create'): bool
    
        $rules = $this->$method();

        $validator = Validator::make($data, $rules);

        if ($validator->fails()) 
            if(request()->wantsJson())
            
                return response()->json($validator->errors(), 400);
            
            throw new ValidationException($validator);
        

        return true;
    

    public function social_login()
    
        $rules = [
            'access_token'=> ['required']
        ];

        return $rules;
    

【讨论】:

以上是关于Laravel:模型内的验证。多重验证规则的主要内容,如果未能解决你的问题,请参考以下文章

使用 FluentValidation 在一条规则中进行多重验证

具有唯一字段的 Laravel 验证服务

Laravel - 在自定义验证中使用验证规则

v文本字段中的多重验证规则

Laravel 有时验证规则

easyui关于validatebox实现多重规则验证的实践