通过用户名以编程方式更改用户密码
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();
}
}
此代码未经测试,但您明白了。
我正在尝试通过 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();
}
}
此代码未经测试,但您明白了。