Symfony 4, отредактируйте сущность пользователя и сохраните новый пароль - PullRequest
0 голосов
/ 26 марта 2019

Я выполнил команду make:crud для генерации некоторых файлов для пользователя сущности.

Все работает как шарм, но у меня есть одна проблема, когда я редактирую пользователя.Когда я редактирую пользователя, я могу:

  • изменить пароль и сохранить

или

  • не изменять пароль и сохранить

От сгенерированного пользователем контроллера 'edit':

/**
 * @Route("/{id}/edit", name="user_edit", methods={"GET","POST"})
 */
public function edit(Request $request, User $user): Response
{
    $form = $this->createForm(UserType::class, $user);
    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid()) {

        // HERE : How can I check if the password was changed ? 

        $this->getDoctrine()->getManager()->flush();

        return $this->redirectToRoute('user_index', [
            'id' => $user->getId(),
        ]);
    }

    return $this->render('user/edit.html.twig', [
        'user' => $user,
        'form' => $form->createView(),
        'title' => 'edit userr'
    ]);
}

Как я могу проверить, был ли изменен пароль?Пользовательская переменная содержит новое значение пароля ...

Если пароль новый, я должен использовать службу кодировщика.Если нет, я просто должен обновить пользователя с новыми данными

1 Ответ

2 голосов
/ 26 марта 2019

Для этого полезно иметь переменную класса в вашем пользователе, которая не записывается в базу данных.Затем в вашей форме вы можете использовать эту переменную для временного хранения обновленного пароля, который вы затем закодируете и удалите.Вот для чего нужен 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...