Extending Sonata User Bundle and adding new fields [closed]

谁都会走 提交于 2019-12-17 10:48:07

问题


I am extending the Sonata User Bundle and creating some extra fields in the new user entity. These fields will only be updated within the Sonata admin area under users so they do not need to be available in the edit profile form. I am having trouble updating these fields via the Sonata User Manager and tried several different ways to extend/implement that class in Application\Sonata\UserBundle. Has anyone encountered this before and can give me a tutorial or step by step process of the cleanest way to extend the new User entity?


回答1:


1. Create a new bundle

Something like AcmeUserBundle. Create it and register it as you do normally.

2. Create a new User entity

Then create a User and Group entity which extends Sonata\UserBundle\Entity\BaseUser and Sonata\UserBundle\Entity\BaseGroup. You should also add the configuration for the primary key, for instance:

/**
* @ORM\Entity
* @ORM\Table(name="fos_user")
*/
class User extends BaseUser
{
    /**
    * @ORM\Id
    * @ORM\Column(type="integer")
    * @ORM\GeneratedValue(strategy="AUTO")
    */
    protected $id;
}

3. Configure the entity

then, go to your app/config/config.yml file and configure these new entities:

sonata_user:
    class:
        user: Acme\UserBundle\Entity\User
        group: Acme\UserBundle\Entity\Group

4. Override the UserAdmin class

Then, you need to create a new UserAdmin class. To do this, just create a new UserAdmin class inside your bundle, extend Sonata\UserBundle\Admin\Model\UserAdmin and override the methods like this:

namespace Acme\UserBundle\Admin;

use Sonata\UserBundle\Admin\Model\UserAdmin as SonataUserAdmin;

class UserAdmin extends SonataUserAdmin
{
    /**
        * {@inheritdoc}
        */
    protected function configureFormFields(FormMapper $formMapper)
    {
        parent::configureFormFields($formMapper);

        $formMapper
            ->with('new_section')
                ->add(...)
                // ...
            ->end()
        ;
    }
}

5. Replace the old UserAdmin class

Then, you need to make sure Sonata uses the new UserAdmin class. You just need to set the sonata.user.admin.user.class parameter to your new class and your ready!

# app/config/config.yml
parameters:
    sonata.user.admin.user.class: Acme\UserBundle\Admin\UserAdmin



回答2:


I found out the issue was a doctrine issue. My extended bundle was utilizing the original xml field mappings. I deleted those files and reverted to annotations. Everything worked brilliantly from there. I hope this helps someone else who is experiencing the same issue.




回答3:


This is easy, yet the SonataUserBundle documentation is pretty short on this. Basically, after setting up the two bundles as described here and here:

You need to create a class to extend the Sonata\UserBundle\Entity\BaseUser class in SonataUserBundle. Note that if you override the constructor, you still must call the parent object's constructor.

namespace Your\Bundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\ORM\EntityManager;
use Sonata\UserBundle\Entity\BaseUser as BaseUser;

/**
 * @ORM\Entity
 * @ORM\Table(name="user",indexes={@ORM\Index(name="username_idx", columns={"username"})})
 */

class User extends BaseUser {

    public function __construct()
    {
        parent::__construct();
        // your code here
    }

    /**
     * @ORM\Column(type="string")
     */
    protected $firstName = "";

    public function getFirstName() {
        return $this->firstName;
    }

    public function setFirstName($firstName) {
        $this->firstName = $firstName;
    }
}

If you need to, you can also override the Sonata\UserBundle\Entity\BaseGroup object in a similar way.

Then, edit your config.yml to match your namespaces, like this

# FOS User Bundle Configuration
fos_user:
    user_class: Your\Bundle\Entity\User
    # To also override the Group object
    # group:
    #     group_class: Your\Bundle\Entity\Group

# Sonata User Bundle configuration
sonata_user:
    class:
        user:               Your\Bundle\Entity\User
        # To also override the Group object
        # group:              Your\Bundle\Entity\Group

Clear the cache. Your entities will be used instead of the built-in ones.



来源:https://stackoverflow.com/questions/15621993/extending-sonata-user-bundle-and-adding-new-fields

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!