Как сделать Laravel Validator $rules необязательным?

Допустим, у меня есть модель User с двумя методами:

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 */
        }
    }
}

Мой вопрос: как сделать правила проверки необязательными, чтобы даже если данные для update() были просто полем email, оно игнорировало бы user и по-прежнему проверяло бы до true.
Возможно ли это вообще или я что-то упустил?

Извините за мой плохой английский.


person intelis    schedule 26.08.2013    source источник


Ответы (3)


Не уверен, правильно ли я понимаю ваш вопрос, но если пользователь является необязательным, вы должны удалить «требуемый» из валидатора. Таким образом, у вас будет:

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

вместо:

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

С другой стороны, я создаю собственный метод для своих моделей, который может возвращать пользовательские правила проверки в зависимости от входящих параметров.

Например:

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'
        );
    }
}

Я думаю, это только личный выбор, но я обнаружил, что получение правил проверки из метода позволяет лучше контролировать то, что я действительно хочу проверить, особенно когда вы хотите выполнить некоторые расширенные проверки.

Надеюсь, это поможет вам.

person Juan Carlos Brown    schedule 26.08.2013
comment
Я думаю, вопрос в том, как пропустить уникальный при обновлении. - person Joeri; 16.10.2015
comment
@Joeri, он ничего не говорит о пропуске уникальности при обновлении, он говорит, что иногда он хотел бы проверить имя пользователя, а иногда он хотел бы проверить электронную почту. Мне приходит на ум несколько ситуаций для этого типа проверки, например, форма, которая позволяет некоторым полям быть нулевыми в зависимости от статуса другого поля. - person Juan Carlos Brown; 19.10.2015
comment
Карлос. Истинный. Но мой опыт таков, что с уникальным laravel не будет обновляться. Я думаю, потому что столбец уже не уникален? - person Joeri; 19.10.2015
comment
Ну, это зависит от ограничений на уровне базы данных, правила модели не могут переопределить ограничения базы данных. Но можно указать уникальный для модели, а не для таблицы, и по-прежнему разрешать дублирование, изменяя правила модели в зависимости от особых обстоятельств. - person Juan Carlos Brown; 19.10.2015
comment
Вы предлагаете использовать таблицу, не требующую уникальных имен пользователей, которую вы хотите проверить на уникальность в модели? - person Joeri; 19.10.2015
comment
Вовсе нет, но при определенных обстоятельствах вы можете разрешить, например, дублирование электронной почты. - person Juan Carlos Brown; 19.10.2015

В Laravel вы можете вызвать update() для модели, и она не будет проверяться по умолчанию, что даст вам желаемое поведение, которое вы описали. В опубликованном вами коде вы явно переопределяете метод update() для принудительной проверки.

Есть два способа сделать поле «пользователь» необязательным в опубликованном вами коде:

  1. Не устанавливайте «обязательно» в правилах $ для этого поля.

    'user'  => 'unique:users|alpha_num',
    
  2. Не переопределяйте метод update() для принудительной проверки перед обновлением.

person Ben Claar    schedule 26.08.2013

Как насчет:

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 */
    }
}
person Joeri    schedule 16.10.2015