简体   繁体   English

如何使Laravel的Validator $规则可选?

[英]How to make Laravel's Validator $rules optional?

Let's say I have User model with two methods: 假设我有两种方法的User模型:

User.php user.php的

class User extends Eloquent
{  
    /* Validation rules */
    private static $rules = array(
        'user'  => 'unique:users|required|alpha_num',
        'email' => 'required|email'
    );

    /* Validate against registration form */
    public static function register($data)
    {
        $validator = Validator::make($data, static::$rules);
        if($validator->fails())
        {
            /*... do someting */
        }
        else
        {
            /* .. do something else */
        }
    }

    /* Validate against update form */
    public static function update($data)
    {
        $validator = Validator::make($data, static::$rules);
        if($validator->fails())
        {
            /*... do someting */
        }
        else
        {
            /* .. do something else */
        }
    }
}

My question : How can I make validation rules optional, so even if data for update() would be just email field, it would ignore user and still validate to true . 我的问题 :如何使验证规则可选,因此即使update()数据只是email字段,它也会忽略user并仍然验证为true
Is this even possible or am I missing something? 这甚至可能还是我错过了什么?

Sorry for my bad English. 对不起,我的英语不好。

Not sure if I'm getting your question right but if the user is optional you should remove 'required' from the validator. 不确定我的问题是否正确,但如果用户是可选的,则应从验证器中删除“必需”。 This way you will have: 这样你就会:

'user'  => 'unique:users|alpha_num',

instead of: 代替:

'user'  => 'unique:users|required|alpha_num',

On the other hand I create a custom method for my models that is able to return custom validation rules depending on incoming parameters. 另一方面,我为我的模型创建了一个自定义方法,该方法能够根据传入参数返回自定义验证规则。

For example: 例如:

private function getValidationRules($rules)
{
    if ($rules == UPDATE_EMAIL)
    {
        return array('email' => 'required|email');
    } else {
        return array(
            'user'  => 'unique:users|required|alpha_num',
            'email' => 'required|email'
        );
    }
}

I guess it's only a personal choice, but I have found that getting the validation rules from a method allows more control over what I really want to validate, especially when you want to perform some advanced validations. 我想这只是个人选择,但我发现从方法中获取验证规则可以更好地控制我真正想要验证的内容,尤其是当您想要执行一些高级验证时。

Hope it helps you. 希望它能帮到你。

In stock Laravel, you can call update() on a model, and it won't validate by default, which will give you the desired behavior you described. 在库存Laravel中,您可以在模型上调用update() ,默认情况下它不会验证,这将为您提供所描述的所需行为。 In the code you posted, you're explicitly overriding the update() method to force validation. 在您发布的代码中,您明确地覆盖了update()方法以强制进行验证。

There are two ways to make the "user" field optional in the code you posted: 有两种方法可以使您发布的代码中的“用户”字段可选:

  1. Don't set "required" in your $rules for that field. 不要在$ field中为该字段设置“required”。

     'user' => 'unique:users|alpha_num', 
  2. Don't override the update() method to force validation before updating. update()之前,请勿覆盖update()方法以强制进行验证。

How about: 怎么样:

private static $rules = array(
    'user'  => 'unique:users|required|alpha_num',
    'email' => 'required|email'
);
private static $update_rules = array(
    'user'  => 'required|alpha_num',
    'email' => 'required|email'
);

* Validate against registration form */
public static function register($data)
{
    $validator = Validator::make($data, static::$rules);
    if($validator->fails())
    {
        /*... do someting */
    }
    else
    {
        /* .. do something else */
    }
}

/* Validate against update form */
public static function update($data)
{
    $validator = Validator::make($data, static::$update_rules);
    if($validator->fails())
    {
        /*... do someting */
    }
    else
    {
        /* .. do something else */
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM