SonataAdminBundle无法更新用户密码

nis*_*ooy 4 change-password symfony fosuserbundle sonata-admin

我无法通过sonataadmin仪表板更新用户密码.

我使用symfony2 FosUserBundle2.0 SonataAdminBundle(但使用SonataUserBundle)并按照文档进行操作.

MyUserBundle\Admin\UserAdmin.php class UserAdmin像这样扩展Admin

protected function configureFormFields(FormMapper $formMapper)
{
    $formMapper
        ......
        ->add('plainPassword', 'repeated', array(
            'type' => 'password',
            'options' => array('translation_domain' => 'FOSUserBundle'),
            'first_options' => array('label' => 'form.password'),
            'second_options' => array('label' => 'form.password_confirmation'),
            'invalid_message' => 'fos_user.password.mismatch',
                'required'    => false,
            )
        )
        ..
}
Run Code Online (Sandbox Code Playgroud)

使用sonataadminbundle仪表板创建新用户时没有问题,但是当我使用仪表板更新密码时,DB中的密码不会更改.

其他人可以更新但密码,我不知道为什么.没有任何错误信息.

我是symfony2的新手,有人帮我吗?

感谢kwozny,现在我修复它〜 我不改变函数configureFormFields代码,只需按照kwozny的建议,添加以下代码.我不知道为什么,但我工作!我可以更新密码,当我更新其他密码(密码字段为空)时,密码不会更改.

public function prePersist($object)
    {
        parent::prePersist($object);

    }
    public function preUpdate($object)
    {
        parent::preUpdate($object);

    }
Run Code Online (Sandbox Code Playgroud)

kam*_*woz 8

那是因为您必须捕获对象User(preUpdate()和prePersist())并使用$ user-> setPlainPassword设置密码.这就是我的代码看起来如何:

代替:

->add('plainPassword', 'repeated', array(
        'type' => 'password',
        'options' => array('translation_domain' => 'FOSUserBundle'),
        'first_options' => array('label' => 'form.password'),
        'second_options' => array('label' => 'form.password_confirmation'),
        'invalid_message' => 'fos_user.password.mismatch',
            'required'    => false,
        )
    )
Run Code Online (Sandbox Code Playgroud)

我有:

            ->add('newPass', 'text', array(
                'label' => 'New password (empty filed means no changes)',
                'required' => FALSE
            ))
Run Code Online (Sandbox Code Playgroud)

然后在同一个管理文件中:

public function prePersist($object) {
    parent::prePersist($object);
    $this->updateUser($object);
}

public function preUpdate($object) {
    parent::preUpdate($object);
    $this->updateUser($object);
}

public function updateUser(\AppBundle\Entity\User $u) {
    if ($u->getNewPass()) {
        $u->setPlainPassword($u->getNewPass());
    }

    $um = $this->getConfigurationPool()->getContainer()->get('fos_user.user_manager');
    $um->updateUser($u, false);
}
Run Code Online (Sandbox Code Playgroud)