2016-10-14 4 views
9

ओवरराइड किए बिना Symfony2 पासवर्ड रीसेट करें मैं उपयोगकर्ता फॉर्म को रीसेट करने वाला एक फॉर्म बनाने की कोशिश कर रहा हूं। मैं FOSUserBundle उपयोग कर रहा हूँ उपयोगकर्ताओं को प्रबंधित करने के लिए, लेकिन मैं कुछ वास्तुकला कारणोंFOSUser

तो मैं पासवर्ड

पुनर्स्थापित करने के लिए PasswordResettingType.php

अपने ही प्रकार और नियंत्रक बनाने का निर्णय लिया की वजह से FOSUser नियंत्रक को रीसेट ओवरराइड करने के लिए नहीं करना चाहते हैं
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' 
    )); 
} 

नियंत्रक रीसेट किया जा रहा

/** 
* @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) }} 

लेकिन जब मैं फ़ॉर्म सबमिट करेंगे, नया पासवर्ड सेट नहीं है, ConfirmationToken और PasswordRequestedAt शून्य पर सेट नहीं हैं।

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

मुझे एक बेवकूफ सवाल पूछना चाहिए, क्योंकि व्यक्तिगत रूप से मैं इस तरह के मुद्दे पर ढेर कर सकता हूं: क्या आप सुनिश्चित हैं कि आप $ form-> isValid() = true है? इस कोड के लिए काम करने के लिए कोई अन्य कारण नहीं है। – Danny

+0

नहीं, यह बेवकूफ सवाल नहीं है :) और हाँ, मैंने इसे चेक किया है और मुझे परेशान है कि कोड अभी भी काम नहीं करता है। – blahblah

+0

क्या आप अपनी लॉग फ़ाइल में क्या देखने जा रहे हैं? –

उत्तर

6

मुझे लगता है कि आप इसे गलत तरीके से कर रहे हैं: के बाद आप कुछ डेटा साफ़ कर सकते

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

:

0

आप इस तरह नया पासवर्ड सेट करने की है। यदि आप एफओएस उपयोगकर्ता को देखते हैं और दस्तावेज़ीकरण के साथ पढ़ते हैं, तो आप देखेंगे कि वे EventListeners का उपयोग कर ऐसा कर रहे हैं।

इसका मतलब है कि आप उन पर हुक कर सकते हैं और अपनी सामग्री कर सकते हैं। या यदि आप इसे नहीं करना चाहते हैं तो आप इसे ओवरराइड कर सकते हैं और अपना खुद का बना सकते हैं। इस तरह के आधे रास्ते को करने से आप ठीक से काम नहीं कर रहे हैं। उदाहरण के लिए आप onResettingResetInitialize ईवेंट की जांच नहीं कर रहे हैं जो जांचता है कि पासवर्ड अनुरोध समाप्त हो गया है या नहीं।

पिछले जवाब के बारे में मुझे लगता है कि तुम सच में ऐसा करने की जरूरत नहीं है:

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

के बाद से है कि UserManager-> UpdateUser()

वैसे का काम है: नहीं कर सकते आप वहां से डीबग करते हैं और एक डंप ($ उपयोगकर्ता) डालते हैं; बाहर निकलें(); और जांच करें कि आउटपुट क्या है और यदि इसे ठीक से कहा जा रहा है।

इसके अलावा बोल्जी टिप्पणी सही है:/रीसेट/{टोकन} एफओएस का एक ही मार्ग है। यदि आप echo debug_backtrace() का उपयोग कर UpdateUser को डीबग करते हैं; आप यह भी देख सकते हैं कि UpdateUser कहां कहा जा रहा है।

+0

धन्यवाद, लेकिन इससे मदद नहीं मिली – blahblah