Программно изменен пароль пользователя по имени пользователя

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

Error: Call to a member function setPassword() on arrayin _password_change() 

Я использую эту функцию:

$userName = 'user1';
$password = 'Password1';
$nid = '1';

function _password_change($userName, $password) {
    
    
      $user_storage = \Drupal::EntityTypeManager()->getStorage('user');
    
      $user = $user_storage->loadByProperties(['name' => $userName]);
    
      $user->setPassword($password);
    
      $user->save();
    
    
    }

Если я использую $user = $user_storage->load($nid); вместо $user = $user_storage->loadByProperties(['name' => $userName]); код работает нормально, и пароль применяется успешно, к сожалению, данная информация будет именем пользователя, а не идентификатором объекта.

В $userName, $password и $nid устанавливаются вручную для тестирования предложений.

Что я могу сказать, вызываю ли я его с помощью идентификатора загрузки, я возвращаю объект, но если я вызываю его с помощью loadByProperties, я возвращаюсь и массив, поэтому он не может применить функцию setPassword.

Каким будет способ загрузить объект сущности по имени пользователя в качестве объекта и иметь возможность применить новый пароль?

1 ответ

Решение

loadByProperties возвращает массив объектов сущности.
Итак, вы хотите вызвать setPassword для первого элемента в массиве, который должен быть вашим пользовательским объектом.
Пока вы там, вам также, вероятно, следует проверить, существует ли пользователь с данным именем пользователя, проверив длину массива, возвращаемого loadByProperties.

function _password_change($userName, $password) {
  $user_storage = \Drupal::EntityTypeManager()->getStorage('user');
  $users = $user_storage->loadByProperties(['name' => $userName]);
  // check we got 1 (only 1) user
  if (count($users) == 1) {
    //get the user from the array.
    $user = reset($users);
    $user->setPassword($password);
    $user->save();
  }
}

Этот код не тестировался, но идею вы поняли.

Другие вопросы по тегам