使用 postPersist($object) 方法更新密码 SonataAdminBundle

Update password with postPersist($object) method SonataAdminBundle

我需要用 sonata admin int fos userbundle 'bcrypt' 密码更新密码。

这是我的管理员 class,

<?php

namespace AdminBundle\Admin;

use Sonata\AdminBundle\Admin\Admin;
use Sonata\AdminBundle\Datagrid\ListMapper;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
use Sonata\AdminBundle\Form\FormMapper;
use Sonata\AdminBundle\Show\ShowMapper;

class UserAdmin extends Admin {
    public function postPersist($object) {
        $userManager = $this->get('fos_user.user_manager');
        $user = $userManager->findUserBy(array('id'=>$object->id));
        $user->setPlainPassword('test');
        $userManager->updateUser($user);

    }

这是我的用户实体,

<?php

// src/AppBundle/Entity/User.php

namespace AdminBundle\Entity;

use FOS\UserBundle\Model\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="fos_user")
 */
class User extends BaseUser {

    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @var string
     *
     * @ORM\Column(name="telephone", type="text", length=30, nullable=false)
     */
    private $telephone;

    /**
     * Set nonotification
     *
     * @param text $telephone
     * @return User
     */
    public function settelephone($telephone) {
        $this->telephone = $telephone;

        return $this;
    }

    /**
     * Get telephone
     *
     * @return text
     */
    public function gettelephone() {
        return $this->telephone;
    }

    /**
     * @var string
     *
     * @ORM\Column(name="name", type="text", length=60, nullable=false)
     */
    private $name;

    /**
     * Set nonotification
     *
     * @param text $name
     * @return User
     */
    public function setname($name) {
        $this->name = $name;

        return $this;
    }

    /**
     * Get name
     *
     * @return text
     */
    public function getname() {
        return $this->name;
    }

    /**
     * @var string
     *
     * @ORM\Column(name="surname", type="text", length=60, nullable=false)
     */
    private $surname;

    /**
     * Set nonotification
     *
     * @param text $name
     * @return User
     */
    public function setsurname($surname) {
        $this->surname = $surname;

        return $this;
    }

    /**
     * Get surname
     *
     * @return text
     */
    public function getsurname() {
        return $this->surname;
    }

    public function __construct() {
        parent::__construct();
        // your own logic
    }

}

但我却收到了这个错误,

Attempted to call an undefined method named "get" of class "AdminBundle\Admin\UserAdmin". Did you mean to call e.g. "getActiveSubClass", "getActiveSubclassCode", "getBaseCodeRoute", "getBaseControllerName", "getBaseRouteName", "getBaseRoutePattern", "getBatchActions", "getBreadcrumbs", "getChild", "getChildren", "getClass", "getClassnameLabel", "getCode", "getConfigurationPool", "getCurrentChild", "getCurrentChildAdmin", "getDataSourceIterator", "getDatagrid", "getDatagridBuilder", "getExportFields", "getExportFormats", "getExtensions", "getFilterFieldDescription", "getFilterFieldDescriptions", "getFilterParameters", "getFilterTheme", "getForm", "getFormBuilder", "getFormContractor", "getFormFieldDescription", "getFormFieldDescriptions", "getFormGroups", "getFormTabs", "getFormTheme", "getIdParameter", "getLabel", "getLabelTranslatorStrategy", "getList", "getListBuilder", "getListFieldDescription", "getListFieldDescriptions", "getManagerType", "getMaxPageLinks", "getMaxPerPage", "getMenuFactory", "getModelManager", "getNewInstance", "getNormalizedIdentifier", "getObject", "getObjectIdentifier", "getObjectMetadata", "getParent", "getParentAssociationMapping", "getParentFieldDescription", "getPerPageOptions", "getPermissionsShow", "getPersistentParameter", "getPersistentParameters", "getRequest", "getRoot", "getRootCode", "getRouteBuilder", "getRouteGenerator", "getRouterIdParameter", "getRoutes", "getSecurityHandler", "getSecurityInformation", "getShow", "getShowBuilder", "getShowFieldDescription", "getShowFieldDescriptions", "getShowGroups", "getShowTabs", "getSideMenu", "getSubClasses", "getSubject", "getTemplate", "getTemplates", "getTranslationDomain", "getTranslationLabel", "getTranslator", "getUniqid", "getUrlsafeIdentifier" or "getValidator"?

有人能调查一下会很有帮助。

您无法通过 sonata 管理员 class 使用 $this->get('service.name') 访问容器。你应该使用:

$container = $this->getConfigurationPool()->getContainer();
$userManager = $container->get('fos_user.user_manager');

此外,我不知道您的解决方案是否可行。我会使用这样的东西:

public function postPersist($object) {
    $container = $this->getConfigurationPool()->getContainer();
    $entityManager = $container->get('doctrine.orm.entity_manager');
    $object->setPlainPassword('test');
    $entityManager->persist($user);
    $entityManager->flush();
}

帮自己一个忙,尊重命名约定(getName 而不是 getname,等等)