Как использовать ограничения в контроллере - PullRequest
0 голосов
/ 29 мая 2018

Я пытался добавить страницу редактирования пользователя, где они могут изменить имя пользователя, адрес электронной почты и пароль.

Одна вещь, которую я пытаюсь реализовать, - это ввести старый пароль, чтобыв состоянии изменить его на новый.

Я читал эти страницы:

но я действительно борюсь за реализацию.

Вот мой контроллер для формы:

<?php
    namespace App\Controller\User;

    use App\Entity\User;
    use App\Form\User\EditUserType;
    use App\Repository\UserRepository;
    use Symfony\Bundle\FrameworkBundle\Controller\Controller;
    use Symfony\Component\HttpFoundation\Request;
    use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;

    class EditController extends Controller
    {
        public function edit(Request $request, UserPasswordEncoderInterface $encoder)
        {
            $userInfo = ['username' => null, 'plainPassword' => null, 'password' => null, 'email' => null];

            $form = $this->createForm(EditUserType::class, $userInfo);
            $form->handleRequest($request);

            $user        = new User();
            $oldPassword = $user->getPassword();

            if ($form->isSubmitted() && $form->isValid()) {
                $userInfo = $form->getData();

                $username = $userInfo['username'];
                $email    = $userInfo['email'];
                $newPass  = $userInfo['plainPassword'];
                $oldPass  = $userInfo['password'];

                $encryptOldPass = $encoder->encodePassword($user, $oldPass);

                if ($oldPassword === $encryptOldPass) {
                    $this->addFlash('danger', $oldPass. ' ' .$encryptOldPass. ' ' .$oldPassword);
                    return $this->redirectToRoute('user_edit');
                } else {
                    $this->addFlash('success', $oldPassword. '-' .$encryptOldPass);
                    return $this->redirectToRoute('user_edit');
                }

                $pass = $encoder->encodePassword($user, $newPass);

                $user->setPassword($pass);
                $user->setEmail($email);
                $user->setUsername($username);

                echo 'trey was here';

                $this->addFlash('success', 'User Details Edited');

                return $this->redirectToRoute('user_edit');
            }

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

мой файл EditUserType:

<?php
    namespace App\Form\User;

    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\Extension\Core\Type\EmailType;
    use Symfony\Component\Form\Extension\Core\Type\PasswordType;
    use Symfony\Component\Form\Extension\Core\Type\RepeatedType;
    use Symfony\Component\Form\Extension\Core\Type\TextType;
    use Symfony\Component\Form\FormBuilderInterface;
    use Symfony\Component\OptionsResolver\OptionsResolver;

    class EditUserType extends AbstractType
    {
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder->add('email', EmailType::class)
                ->add('username', TextType::class)
                ->add('password', PasswordType::class, array())
                ->add('plainPassword', RepeatedType::class, array(
                    'type' => PasswordType::class,
                    'first_options' => array('label' => 'New Password'),
                    'second_options' => array('label' => 'New Repeat Password')
                ));
        }

        public function configureOptions(OptionsResolver $resolver)
        {
            $resolver->setDefaults(array());
        }
    }

myvalidation (файл: config / validator / validation.yaml)

App\Form\User\EditUserType:
    properties:
        oldPassword:
            - Symfony\Component\Security\Core\Validator\Constraints\UserPassword:
                message: 'Invalid Password'

мой файл шаблона:

{% include 'builder/header.html.twig' %}

<div class="user-container" id="user-content">
    {% block body %}
        {% include 'builder/notices.html.twig' %}

        <div class="user-container">
            <i class="fas fa-user-edit fa-5x"></i>
        </div>

        <hr />

        {{ form_start(form) }}
            {{ form_row(form.username, { 'attr': {'class': 'form-control', 'value': app.user.username} }) }}
            {{ form_row(form.email, { 'attr': {'class': 'form-control', 'value': app.user.email} }) }}
            {{ form_row(form.password, { 'attr': {'class': 'form-control'} }) }}
            {{ form_row(form.plainPassword.first, { 'attr': {'class': 'form-control'} }) }}
            {{ form_row(form.plainPassword.second, { 'attr': {'class': 'form-control'} }) }}

            <div class="register-btn-container">
                <button class="btn btn-danger" id="return-to-dash-btn" type="button">Cancel!</button>
                <button class="btn btn-primary" type="submit">Update!</button>
            </div>
        {{ form_end(form) }}
    {% endblock %}
</div>

{% include 'builder/footer.html.twig' %}

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

Спасибо

1 Ответ

0 голосов
/ 29 мая 2018

Нашел решение, используя cerad комментарий к предыдущему (теперь удаленному) ответу:

обновлен контроллер:

<?php
    namespace App\Controller\User;

    use App\Form\User\EditUserType;
    use Symfony\Bundle\FrameworkBundle\Controller\Controller;
    use Symfony\Component\HttpFoundation\Request;
    use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;


    class EditController extends Controller
    {
        public function edit(Request $request, UserPasswordEncoderInterface $encoder)
        {
            $userInfo = ['username' => null, 'plainPassword' => null, 'password' => null, 'email' => null];

            $form = $this->createForm(EditUserType::class, $userInfo);
            $form->handleRequest($request);

            $user = $this->getUser();

            $entityManager = $this->getDoctrine()->getManager();

            if ($form->isSubmitted() && $form->isValid()) {
                $userInfo = $form->getData();

                $username = $userInfo['username'];
                $email    = $userInfo['email'];
                $newPass  = $userInfo['plainPassword'];
                $oldPass  = $userInfo['password'];

                if (!$encoder->isPasswordValid($user, $oldPass)) {
                    $this->addFlash('danger', 'Old password is invalid. Please try again');
                    return $this->redirectToRoute('user_edit');
                }

                $pass = $encoder->encodePassword($user, $newPass);

                $user->setPassword($pass);
                $user->setEmail($email);
                $user->setUsername($username);

                $entityManager->persist($user);
                $entityManager->flush();

                $this->addFlash('success', 'User Details Edited - Please Login Again');

                return $this->redirectToRoute('login');
            }

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

проблема была в том, что я не проверял вошедшие в систему данные пользователяи я подумал, что постоянный означает вставку, а не вставку / обновление - поэтому не хватает знаний об этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...