2015-09-15 3 views
2

Доброе утро, я пытаюсь сделать форму смены пароля, но без каких-либо успехов до сих пор я занимался исследованиями в этой части, и я не нашел полезных результатов в google, поэтому я пришел сюда : DИзменение пароля пользователя Symfony2

Это мой контроллер действия для изменения пароля

/** 
* 
* @Route("/user/change-password", name="change_password") 
* @Template() 
* 
*/ 
public function changePasswordAction(Request $request) { 
    $changePasswordModel = new ChangePassword(); 

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

    $form->handleRequest($request); 

    if($form->isValid()) { 
     $changePassword = $form->getData(); 

     $factory = $this->get('security.encoder_factory'); 
     $encoder = $factory->getEncoder($changePassword->getUser()); 

     var_dump($encoder); 
     $password = $encoder->encodePassword($changePassword->getUser()->getPlainPassword(), $changePassword->getUser()->getSalt()); 

     $changePassword->getUser()->setPassword($password); 

     $em->persist($changePassword->getUser()); 
     $em->flush(); 

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

    return array(
      'form' => $form->createView(), 
     ); 
} 

Изменение пароля Модель

/** 
* @Assert\Type(type="AppBundle\Entity\User") 
* @Assert\Valid() 
*/ 
protected $user; 

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

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

public function setUser(User $user) 
{ 
    $this->user = $user; 
} 

public function getUser() 
{ 
    return $this->user; 
} 

public function setPassword($password) { 

    $this->password = $password; 

    return $this; 
} 

public function getPassword() { 

    return $this->password; 
} 

public function setPlainPassword($plainPassword) { 

    $this->plainPassword = $plainPassword; 

    return $this; 
} 

public function getPlainPassword() { 

    return $this->plainPassword; 
} 

Пароль Тип

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder->add('password', 'password'); 
    $builder->add('plainPassword', 'repeated', array(
     'type' => 'password', 
     'invalid_message' => 'The password fields must match.', 
     'required' => true, 
     'first_options' => array('label' => 'Password'), 
     'second_options' => array('label' => 'Repeat Password'), 
    )); 
    $builder->add('ChangePassword', 'submit'); 
} 

Моя текущая ошибка:

No encoder has been configured for account "". 
500 Internal Server Error - RuntimeException 

Забыл добавить security.yml

encoders: 
    AppBundle\Entity\User: 
     algorithm: bcrypt 
     cost: 15 
# http://symfony.com/doc/current/book/security.html#where-do-users-come-from-user-providers 
providers: 
    in_memory: 
     memory: ~ 
    db_provider: 
     entity: 
      class: AppBundle\Entity\User 
+0

Где вы устанавливаете пользователя для '$ changePasswordModel'? – Yoshi

+0

в контроллере $ changePasswordModel = new ChangePassword(); –

+0

С вашего кода вы не устанавливаете пользователя для этой модели. Вы используете только геттер, а не сеттер. – Yoshi

ответ

2

С текущим кодом вы никогда не установить фактический пользователь, для которого вы хотите изменить пароль , Из-за этого, следующая строка не может, так как null передается в качестве аргумента:

$factory->getEncoder($changePassword->getUser()); 

Если вы хотите придерживаться текущей реализации внешних, вам нужно только, чтобы понять, что ChangePassword на самом деле просто data transfer object, который должен быть правильно настроен. Части этой настройки будут проходить через обработку формы (ChangePasswordType), другие детали должны быть явно заданы вами. Так, например, просто добавьте:

$changePasswordModel = new ChangePassword(); 
$changePasswordModel->setUser($this->getUser()); 

Лично я думаю, что это является Подход хорошей идеей, потому что это делает код более семантический (или выразительным, если вы будете). Просто не забудьте много думать о неявных магии на стороне symfony.

+0

О магии симфонии .. ну .. я вроде привык к магии, и я ожидаю сделать все :)) –

+1

Поверь мне, я знаю, что ты говоришь! ;) – Yoshi