#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();
}
}
Этот код не тестировался, но вы поняли идею.