0

我正在尝试通过他们在 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 函数。

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

4

1 回答 1

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();
  }
}

这段代码未经测试,但你明白了。

于 2020-11-13T22:25:18.307 回答