通过用户名以编程方式更改用户密码

Changed user password programmatically by username

我正在尝试通过 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]); 代码运行正常,不幸的是密码成功应用,给定的信息将是用户名而不是实体 ID。

$userName$password$nid 是手动设置的,用于测试建议。

据我所知,如果我使用加载 ID 调用它,我会返回一个对象,但如果我使用 loadByProperties 调用它,我会返回数组,因此它无法应用 setPassword 函数。

通过用户名作为对象加载实体对象并能够应用新密码的方法是什么?

loadByProperties returns 实体对象数组。
所以你想在数组中的第一个项目上调用 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();
  }
}

此代码未经测试,但您明白了。