0

Form クラスを使用してフォームを生成しています。パスワード再設定フォームです。

このフォームはユーザー エンティティに関連付ける必要があります。フォームが送信されると、パスワードが更新されます。

すべてが私が現在持っているコードで動作していますが、(data_classオプションを使用しているため)必要ではないと思われるいくつかのコードを取り除こうとして、検証が中断されます(フォームがフォームから「切り離された」ように見えるため)実在物)

わかりましたので、いくつかのコード:

public function passwordResetAction(Request $request, $key = NULL)
{
    $user = $this->getDoctrine()
            ->getRepository('DemoUserBundle:User\User')
            ->findOneBy(array('resetToken' => $key));

    if (!$user) {
        throw $this->createNotFoundException('No user found for reset token '.$key.'!');
    }

    $form = $this->createForm(new PasswordResetType(), $user);

    if ($request->getMethod() == 'POST') {
        $form->bindRequest($request);

        if ($form->isValid()) {
            $postData = $request->request->get('resetpass');

            $newPassword = $postData['password'];

            $encoder = new MessageDigestPasswordEncoder('sha1', false, 1);
            $password = $encoder->encodePassword($newPassword, $user->getSalt());
            $user->setPassword($password);

            $newToken = base64_encode($user->getUsername().'|'.date('Y-m-d'));
            $user->setResetToken($newToken);

            $em = $this->getDoctrine()->getEntityManager();
            $em->persist($user);
            $em->flush();

            return $this->redirect($this->generateUrl('password_reset_success'));
        }

    }

    return $this->render('DemoUserBundle:User\Reset:password-reset.html.twig', array('key' => $key, 'form' => $form->createView()));
}

私が興味を持っているコードは、「$form = $this->createForm(new PasswordResetType(), $user);」です。ご覧のとおり、フォーム タイプを使用してフォームを作成し、フォームを User エンティティに関連付ける $user 変数に渡しています。ここで、私が理解できる限り、フォーム タイプにエンティティを設定しているため、このパラメーター セットは必要ありません (コードについては以下を参照)。

namespace Demo\UserBundle\Form\Type\User;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;
use Symfony\Component\Form\FormError;
use Symfony\Component\Form\CallbackValidator;

class PasswordResetType extends AbstractType
{
    public function buildForm(FormBuilder $builder, array $options)
    {
        $builder->add('password', 'password', array('label' => 'New Password'));
        $builder->add('confirmPassword', 'password', array('label' => 'Confirm Password', 'property_path' => false));
        $builder->addValidator(new CallbackValidator(function($form)
            {
                if($form['confirmPassword']->getData() != $form['password']->getData()) {
                    $form['confirmPassword']->addError(new FormError('Passwords must match.'));
            }
        }));
}

public function getDefaultOptions(array $options)
{
    return array(
        'data_class' => 'Demo\UserBundle\Entity\User\User',
    );
}

public function getName()
{
    return 'resetpass';
}

}

したがって、このフォームはデフォルトで User Entity にアタッチされているはずですが ($user 変数は必要ありません)、機能しません。その変数が渡されないと、検証は機能しません (ユーザー エンティティに関連付けられていないことを示します)。

何を与える?アイデアはありますか?

4

2 に答える 2

0

このdata_classオプションは、フォームで使用される適切なデータ マッパーを設定するために使用されます。指定しない場合は、渡されたオブジェクトに基づいて推測します。

オブジェクトをフォームに渡すことから解放されません。どのオブジェクトを操作したいかをどのように知ることができると思いますか?

于 2012-04-11T14:02:43.293 に答える
0

新しい symfony バージョンでは、別のメソッド シグネチャを使用します ($options 変数の代わりにオプション リゾルバー):

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
         'data_class' => 'Demo\UserBundle\Entity\User\User',
    ));
}

Symfony 2.7 に関する注意: フォーム API がわずかに変更されたため、代わりにこれを使用する必要があります。

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
         'data_class' => 'Demo\UserBundle\Entity\User\User',
    ));
}
于 2013-10-19T18:37:26.857 に答える