Сделать Ardent в Laravel не требующим нового пароля при сохранении

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

У меня есть следующие правила проверки для модели пользователя:

public static $rules = array(
    'login'                 => 'required|max:255|alpha_dash|unique',
    'displayname'           => 'required|max:255|unique',
    'email'                 => 'required|email|max:255|unique',
    'password'              => 'required|confirmed',
    'password_confirmation' => 'required',
);

Но это не позволяет мне обновлять модель пользователя, если я не передаю ей пароль. Он просто жалуется на отсутствие пароля.

Как заставить это работать?


person Cysioland    schedule 08.01.2014    source источник


Ответы (3)


Вы можете сделать что-то подобное в своем контроллере:

if ($user->exists)
{
    $user::$rules['password'] = (Input::get('password')) ? 'required|confirmed' : '';
    $user::$rules['password_confirmation'] = (Input::get('password')) ? 'required' : '';
}

$user->save();
person Vivek Manglani    schedule 08.01.2014
comment
Но когда я как-то хочу сменить пароль, то подтверждение не требуется. Это нежелательно. - person Cysioland; 08.01.2014

Это то, о чем люди все еще думают. Но обычно правила создания и обновления будут другими.

public static $create_rules = array(
    'login'                 => 'required|max:255|alpha_dash|unique',
    'displayname'           => 'required|max:255|unique',
    'email'                 => 'required|email|max:255|unique',
    'password'              => 'required|confirmed',
    'password_confirmation' => 'required',
);

public static $update_rules = array(
    'login'                 => 'required|max:255|alpha_dash|unique',
    'displayname'           => 'required|max:255|unique',
    'email'                 => 'required|email|max:255|unique',
);

Затем в вашем коде проверки вы можете

if ( ! $this->exists || Input::get('password'))
{
   $validation_rules = static::$create_rules;
}
else
{
   $validation_rules = static::$update_rules;
}
person Antonio Carlos Ribeiro    schedule 08.01.2014
comment
Но когда я как-то хочу сменить пароль, то подтверждение не требуется. Это нежелательно. - person Cysioland; 08.01.2014
comment
Код был просто, чтобы дать вам некоторые мысли об этом. Вы можете проверить, введен ли пароль во входных данных, затем вы можете просто снова использовать правила создания. Все зависит от того, как вы будете менять пароль пользователя. У меня форма только с двумя входами. Никакие другие пользовательские данные не задействованы. Отредактировано. - person Antonio Carlos Ribeiro; 08.01.2014

Если вы хотите закрепить это поведение за самой моделью (так что не имеет значения, где она создается/сохраняется), вы можете использовать функцию Ardent beforeValidate для изменения правил перед проверкой:

public function beforeValidate() { if(isset($this->id)) { self::$rules['password'] = 'confirmed'; self::$rules['password_confirmation'] = ''; } }

Вы бы просто добавили такой код в любом месте рассматриваемой модели.

person Beau    schedule 13.11.2014