Когда я обновляю свою привязанную к модели форму
$user->update(Input::all())
Поле моего пароля повторно хэшируется, даже если оно пустое. Я установил в своем классе User.php автоматическое хэширование этого поля, но не следует ли его пропустить, так как поле пустое?
Вы можете использовать в этом случае:
Input::except('password')
так что в вашем контроллере вы можете сделать это следующим образом:
if (trim(Input::get('password')) == '') {
$data = Input::except('password');
}
else {
$data = Input::all();
}
$user->update($data);
Однако вы должны рассмотреть другие возможные вопросы для этого. В этом случае, если пользователь отправляет ввод с id
имя (и любой может сделать это, даже если у вас нет такого поля в форме), он может легко изменить пароли / учетные записи других пользователей и уничтожить все ваши данные.
Вы должны использовать в своем User
модель как минимум:
protected $guarded = array('id');
защитить идентификатор пользователя от изменения во время массовое назначение но, возможно, есть и другие поля, которые вы хотели бы защитить (вы должны перечислить их в $guarded
массив.
Для меня гораздо лучшим вариантом в этом случае является использование стандартного пользовательского обновления:
$user = User::find($id);
if (trim(Input::get('password')) != '') {
$user->password = Hash::make(trim(Input::get('password')));
}
$user->name = Input::get('name');
// and so on - this way you know what you are changing and you won't change something you don't want to change
$user->save();
Как прокомментировал Том Берд, вот пример кода.
Если вы используете мутатор, как setPasswordAttribute()
метод в вашей модели, то вы можете сделать это:
public function setPasswordAttribute($password)
{
if (!empty($password))
{
$this->attributes['password'] = bcrypt($password);
}
}
Это предотвратит хэширование нового пароля. Этот метод setPasswordAttribute () называется «мутатором» и стал доступен в Laravel 4.2 из того, что я вижу. http://laravel.com/docs/4.2/eloquent
Поскольку вы отправили все входные данные в модель пользователя, предполагается, что вы хотите обновить все поля, включая пароль, даже если это пустая строка, можно хэшировать пустую строку.
Вам необходимо проверить, является ли пароль пустым и используется ли он Input::except('password')
public function update($id)
{
$register = Register::findOrFail($id);
if (empty(Request::get('password'))) {
$data = Request::except('password');
} else {
$data = Request::all();
}
$register->update($data);
return redirect('register');
}