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

#drupal #drupal-modules #drupal-9

#drupal #drupal-модули #drupal-9

Вопрос:

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

 Error: Call to a member function setPassword() on array in _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 .

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

Ответ №1:

loadByProperties возвращает массив объектов entity.
Итак, вы хотите вызвать SetPassword для первого элемента в массиве, который должен быть вашим объектом user.
Пока вы там, вам также, вероятно, следует проверить, был ли пользователь с указанным именем пользователя, проверив длину массива, возвращаемого 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();
  }
}
  

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