2016-10-14 1 views
9

Ich versuche, ein Formular zu erstellen, das Benutzerkennwort zurücksetzt. Ich verwende FOSUserBundle Benutzer zu verwalten, aber ich will nicht außer Kraft setzen FOSUser Zurücksetzen Controller aufgrund einiger Gründe ArchitekturSymfony2 Kennwortzurücksetzung ohne überschreiben FOSUser

Also beschloss ich, meine eigene Art und Controller zu bauen Passwort zurücksetzen

PasswordResettingType.php

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder->add('plainPassword', RepeatedType::class, array(
     'type' => PasswordType::class, 
     'attr' => ['class' => 'form-group has-feedback'], 
     'first_options' => array('label' => false, 
      'attr' => ['placeholder' => 'New Password'] 
      ), 
     'second_options' => array('label' => false, 
      'attr' => ['placeholder' => 'Repeat Password']), 
     'invalid_message' => 'Passwords don't match', 
    )); 
} 

public function configureOptions(OptionsResolver $resolver) 
{ 
    $resolver->setDefaults(array(
     'data_class' => 'CoreBundle\Entity\User', 
     'csrf_token_id' => 'resetting' 
    )); 
} 

Zurücksetzen Controller

/** 
* @Route("/reset/{token}", name="api_resetting_reset") 
*/ 
public function resetAction(Request $request, $token) 
{ 
    $userManager = $this->get('fos_user.user_manager'); 

    $user = $userManager->findUserByConfirmationToken($token); 

    if (null === $user) { 
     return $this->render('APIBundle:Resetting:error.html.twig'); 
    } 

    $form = $this->createForm(PasswordResettingType::class, $user); 

    $form->handleRequest($request); 

    if ($form->isValid()) { 
     $user->setConfirmationToken(null); 
     $user->setPasswordRequestedAt(null); 
     $user->setPlainPassword($form["plainPassword"]->getData()); 
     $userManager->updateUser($user); 

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

    return $this->render('APIBundle:Resetting:reset.html.twig', array(
     'token' => $token, 
     'form' => $form->createView() 
    )); 
} 

reset.html.twig

{{ form_start(form) }} 

     {% for passwordField in form.plainPassword %} 
      <div class="form-group has-feedback"> 
       {{ form_widget(passwordField, { 'attr': {'class': 'form-control'} }) }} 
       <span class="show">show</span> 
       {{ form_errors(passwordField) }} 
      </div> 
     {% endfor %} 

    <input type="submit" class="btn" value="Submit" /> 
{{ form_end(form) }} 

Aber wenn ich Formular absende, ist das neue Passwort nicht gesetzt, ConfirmationToken und PasswordRequestedAt sind nicht auf null gesetzt.

+0

Ich sollte eine dumme Frage stellen, weil ich persönlich auf das Problem wie folgt stapeln könnte: Sind Sie sicher, dass Sie $ form-> isValid() = true? Kein anderer Grund für diesen Code nicht zu funktionieren. – Danny

+0

Nein, das ist keine blöde Frage :) und ja, ich habe das überprüft und ich bin verwirrt, dass der Code immer noch nicht funktioniert. – blahblah

+0

Haben Sie versucht, in Ihrer Protokolldatei nachzuschauen, was gerade passiert? –

Antwort

6

Ich glaube, Sie es in die falsche Richtung tun. Wenn Sie sich FOS User ansehen und die Dokumentation ausführlich lesen, werden Sie feststellen, dass sie dies unter Verwendung von EventListeners tun.

Das bedeutet, Sie können sie anhängen und Ihre Sachen machen. Oder wenn Sie es nicht tun wollen, können Sie es überschreiben und Ihr eigenes machen. Dies auf halbem Wege zu tun, wie du es tust, wird nicht richtig funktionieren. Beispielsweise überprüfen Sie das onResettingResetInitialize-Ereignis nicht, das überprüft, ob die Kennwortanforderung abgelaufen ist.

über letzte Antwort Ich denke, die Sie nicht wirklich das tun müssen, um:

$encoder = $this->container->get('security.password_encoder'); 
$user->setPassword($encoder->encodePassword($user, $user->getPlainPassword())); 

Da, dass der Auftrag der UserManager-> Updateuser ist()

By the way: Kann nicht Sie debuggen von dort und setzen einen Dump ($ user); exit(); und prüfen, was die Ausgabe ist und ob sie richtig aufgerufen wird.

Auch Boulzy Kommentar ist richtig:/Reset/{Token} ist die gleiche Route von FOS. Wenn Sie den UpdateUser mit echo debug_backtrace() debuggen; Sie können auch sehen, von wo aus der UpdateUser aufgerufen wird.

0

Sie haben das neue Passwort wie folgt festgelegt:

$encoder = $this->container->get('security.password_encoder'); 
$user->setPassword($encoder->encodePassword($user, $user->getPlainPassword())); 

nachdem Sie einige Daten löschen können:

$user->setConfirmationToken(NULL); 
$user->setPasswordRequestedAt(NULL); 
$user->setPlainPassword(NULL); 
+0

Danke, aber es hat nicht geholfen – blahblah

Verwandte Themen