如何在控制器中使用约束

时间:2018-05-29 10:39:07

标签: symfony constraints symfony4

我一直在尝试添加编辑用户页面,以便更改用户名,电子邮件地址和密码。

我想要实现的一件事是他们必须输入旧密码才能将其更改为新密码。

我一直在阅读这些页面:

但我真的在实施方面苦苦挣扎。

这是表格的控制器:

from keras.layers import Input, Flatten
from keras.models import Model
import numpy as np

a = Input(shape=(1, 60))
b = Flatten()(a)
model = Model(inputs=a, outputs=b)

model.compile('sgd', 'mse')
pred = model.predict(x=np.ones(shape=(2, 1, 60)))
print(pred.shape)

我的EditUserType文件:

<?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()));
        }
    }

我的验证(文件:config / validator / validation.yaml)

<?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());
        }
    }

我的模板文件:

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

输入旧密码字段的任何旧密码似乎都得到了,而不是将密码更新为新输入的值..那么如何针对数据库验证旧密码,以便用户可以将其更新为新密码?

由于

1 个答案:

答案 0 :(得分:0)

找到解决方案,使用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()));
        }
    }

问题是,我没有检查登录的用户详细信息,我认为持久性意味着插入,而不是插入/更新 - 因此对此缺乏了解。