Symfony 版本 - 2.8
使用密码加密加载用户实体的夹具时,会发生错误:
[Symfony\Component\Debug\Exception\ContextErrorException]
可捕获的致命错误:传递给 LoadUsersRolesData::__construct() 的参数 1 必须是 Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface 的
实例,没有给出,在 /home 中调用/user/yandex/shop/vendor/doctrine/data-fixtures/lib/Doctrine/Common/DataFixtures/Loader.php 在第 358 行并定义
我根据文档做所有事情:https ://symfony.com/doc/master/bundles/DoctrineFixturesBundle/index.html
编码:
<?php
use Doctrine\Common\Persistence\ObjectManager;
use Doctrine\Common\DataFixtures\AbstractFixture;
use Doctrine\Common\DataFixtures\OrderedFixtureInterface;
use App\ShopBundle\Entity\Role;
use App\ShopBundle\Entity\User;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
class LoadUsersRolesData extends AbstractFixture implements OrderedFixtureInterface
{
private $encoder;
public function __construct(UserPasswordEncoderInterface $encoder)
{
$this->encoder = $encoder;
}
public function load(ObjectManager $manager)
{
$role = new Role();
$role->setName('ROLE_ADMIN');
$role->setDescription('Учётная запись администратора');
$manager->persist($role);
$role2 = new Role();
$role2->setName('ROLE_BUYER');
$role2->setDescription('Учётная запись покупателя');
$manager->persist($role2);
//Добавление пользователя админа
$user = new User();
$user->setUserName('admin');
$user->setEmail('admin@shop.my');
$password = $this->encoder->encodePassword($user, 'admin');
$user->setPassword($password);
$user->getUserRoles()->add($role);
$manager->persist($user);
//Добавление пользователя покупателя
$user2 = new User();
$user2->setUserName('user');
$user2->setEmail('user@shop.my');
//Шифрование пароля
$password = $this->encoder->encodePassword($user2, 'test');
$user2->setPassword($password);
$user2->getUserRoles()->add($role2);
$manager->persist($user2);
$manager->flush();
}
public function getOrder()
{
return 1;
}
}
文档还说可以通过 $this->container 属性加密密码,但我想知道为什么它不能这样工作。Symfony 版本可能不合适。而不是这个应该使用另一个类..?
您的文档链接包含 DoctrineFixturesBundle 3.0 版的文档。这个版本需要Symfony 3.3 及更高版本,它引入了自动装配和自动注册。您看到的错误实际上意味着构造函数没有参数。