1
votes

I need to update password with sonata admin int fos userbundle 'bcrypt' password.

This is my admin 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);

    }

This is my user entity,

<?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
    }

}

But I'm getting this error instead,

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"?

It would be great help someone can look into it.

1
You shouldn't be updating a password in an event. You will save yourself a lot of headaches and problems if you simply set the password when you need to change it; Please check this slide show: ocramius.github.io/doctrine-best-practices/#/47 - Anyone

1 Answers

2
votes

You cannot access the container with $this->get('service.name') from a sonata admin class. You should use:

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

Also, I don't know if your solution would work anyway. I would use something like this:

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

And do yourself a favor and respect the naming conventions (getName instead of getname, etc)