繁体   English   中英

没有FOS Bundle的Symfony密码重置

[英]Symfony Password Reset without FOS Bundle

我正在尝试制作一个用户可以轻松更改密码的表单。 我希望我的逻辑是正确的,但是我得到的错误如下;

Expected argument of type "string", "AppBundle\Form\ChangePasswordType" given

这是我的控制器;

public function changePasswdAction(Request $request)
{
    $changePasswordModel = new ChangePassword();
    $form = $this->createForm(new ChangePasswordType(), $changePasswordModel);

    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid()) {
        // perform some action,
        // such as encoding with MessageDigestPasswordEncoder and persist
        return $this->redirect($this->generateUrl('homepage'));
    }

    return $this->render(':security:changepassword.html.twig', array(
        'form' => $form->createView(),
    ));
}

这是我的模特;

class ChangePassword
{

/**
 * @SecurityAssert\UserPassword(
 *     message = "Wrong value for your current password"
 * )
 */
protected $oldPassword;

/**
 * @Assert\Length(
 *     min = 6,
 *     minMessage = "Password should by at least 6 chars long"
 * )
 */
protected $newPassword;

/**
 * @return mixed
 */
public function getOldPassword()
{
    return $this->oldPassword;
}

/**
 * @param mixed $oldPassword
 */
public function setOldPassword($oldPassword)
{
    $this->oldPassword = $oldPassword;
}

/**
 * @return mixed
 */
public function getNewPassword()
{
    return $this->newPassword;
}

/**
 * @param mixed $newPassword
 */
public function setNewPassword($newPassword)
{
    $this->newPassword = $newPassword;
}   

}

这是我的更改密码类型;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class ChangePasswordType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('oldPassword', 'password');
        $builder->add('newPassword', 'repeated', array(
            'type' => 'password',
            'invalid_message' => 'The password fields must match.',
            'required' => true,
            'first_options'  => array('label' => 'Password'),
            'second_options' => array('label' => 'Repeat Password'),
        ));
    }

}

这是我的观众;

{{ form_widget(form.current_password) }}
{{ form_widget(form.plainPassword.first) }}
{{ form_widget(form.plainPassword.second) }}

@dragoste提到的解决方案对我来说效果很好。 我更改了以下行

$form = $this->createForm(new ChangePasswordType(), $changePasswordModel);

用这条线;

$form = $this->createForm(ChangePasswordType::class, $changePasswordModel);

在最近的Symfony版本中,您只能在createForm传递类名

更改

$form = $this->createForm(new ChangePasswordType(), $changePasswordModel);

$form = $this->createForm(ChangePasswordType::class, $changePasswordModel);

阅读更多关于建筑形式的信息
http://symfony.com/doc/current/best_practices/forms.html#building-forms

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM