Программно изменен пароль пользователя по имени пользователя
Я пытаюсь изменить пароль данного пользователя по его имени пользователя в модуле 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();
}
}
Этот код не тестировался, но идею вы поняли.