Symfony DataFixtures使用UserPasswordHasher哈希密码时字符串转换错误求助
Symfony DataFixtures 密码哈希报错解决:UserPasswordHasher无法转为字符串
问题描述
执行命令 php bin/console doctrine:fixtures:load 时出现严重错误:
Object of class Symfony\Component\PasswordHasher\Hasher\UserPasswordHasher could not be converted to string
错误原因及修复
1. 构造函数语法错误
原代码构造函数中存在属性赋值错误:
public function __construct(UserPasswordHasherInterface $hasher) { $this->$hasher = $hasher; // 错误:多写了一个$符号,程序尝试将对象转为字符串作为属性名 }
修复方式:去掉多余的$,正确赋值给类属性:
public function __construct(UserPasswordHasherInterface $hasher) { $this->hasher = $hasher; }
2. 管理员用户密码赋值错误
原代码创建管理员用户时,错误地将哈希密码赋值给了普通用户$user,而非管理员对象$userAdmin:
$hashPassword = $this->hasher->hashPassword($userAdmin, 'password'); $user->setPassword($hashPassword); // 错误:覆盖普通用户密码,管理员密码未设置
修复方式:改为赋值给$userAdmin:
$hashPassword = $this->hasher->hashPassword($userAdmin, 'password'); $userAdmin->setPassword($hashPassword);
修正后的完整代码
<?php namespace App\DataFixtures; use App\Entity\Author; use App\Entity\Book; use App\Entity\User; use Doctrine\Bundle\FixturesBundle\Fixture; use Doctrine\Persistence\ObjectManager; use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface; class AppFixtures extends Fixture { private UserPasswordHasherInterface $hasher; public function __construct(UserPasswordHasherInterface $hasher) { $this->hasher = $hasher; } public function load(ObjectManager $manager): void { // 创建普通用户 $user = new User(); $user->setEmail('user@bookapi.com'); $user->setRoles(['ROLE_USER']); $hashPassword = $this->hasher->hashPassword($user, 'password'); $user->setPassword($hashPassword); $manager->persist($user); // 创建管理员用户 $userAdmin = new User(); $userAdmin->setEmail('admin@bookapi.com'); $userAdmin->setRoles(['ROLE_ADMIN']); $hashPassword = $this->hasher->hashPassword($userAdmin, 'password'); $userAdmin->setPassword($hashPassword); $manager->persist($userAdmin); // 创建作者 $listAuthors = []; for ($i = 0; $i < 10; $i++){ $author = new Author(); $author->setLastname('Nom' . $i); $author->setFirstname('Prénom' . $i); $manager->persist($author); // 将创建的作者保存到数组中 $listAuthors[]= $author; } // 创建书籍 for ($i = 0; $i < 20; $i++){ $book = new Book(); $book->setTitle('Titre'.$i); $book->setCoverText('Quatrieme de couverture numéro:'.$i); // 将书籍与数组中随机选取的作者关联 $book->setAuthor($listAuthors[array_rand($listAuthors)]); $manager->persist($book); } $manager->flush(); } }
内容的提问来源于stack exchange,提问作者Halit Cinici
相关产品推荐
相关产品推荐

