Для этого полезно иметь переменную класса в вашем пользователе, которая не записывается в базу данных.Затем в вашей форме вы можете использовать эту переменную для временного хранения обновленного пароля, который вы затем закодируете и удалите.Вот для чего нужен eraseCredentials()
-метод в UserInterface.
Например, у вашего пользователя вы можете иметь
class User implements UserInterface
{
private $plainPassword;
// ...
public function setPlainPassword(string $plainPassword)
{
$this->plainPassword = $plainPassword;
}
public function getPlainPassword()
{
return $this->plainPassword;
}
public function eraseCredentials()
{
$this->plainPassword = null;
}
}
Обратите внимание, что private $plainPassword
не имеет никаких ORM-аннотацийэто означает, что он не будет храниться в базе данных.Однако вы можете использовать ограничения проверки, например, если вы хотите убедиться, что пароли имеют минимальную длину или определенную сложность.Вам все еще потребуется поле исходного пароля, в котором хранится зашифрованный пароль.
Затем вы добавляете это поле в форму обновления пользователя вместо поля действительного пароля.В вашем контроллере вы можете только тогда проверить, было ли заполнено новое поле plainPassword, а затем прочитать значение, закодировать его и заменить поле действительного пароля.
if ($form->isSubmitted() && $form->isValid()) {
$user = $form->getData();
if ($user->getPlainPassword() !== null) {
$user->setPassword($this->userPasswordEncoder->encode(
$user->getPlainPassword(),
$user
);
}
// ...
Другой способ сделать это, не добавляя этого«helper» - свойство пользователя использует поле неотображенного поля:
# UserForm
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
// ...
->add('plainPassword', PasswordType::class, ['mapped' => false])
;
}
Контроллер будет выглядеть аналогично, только вы извлекаете данные из не сопоставленного поля вместо пользователя:
$form->get('plainPassword')->getData();