扩展Sonata用户包并添加新字段

时间:2013-03-25 18:22:57

标签: php symfony symfony-sonata

我正在扩展Sonata用户捆绑包并在新用户实体中创建一些额外的字段。这些字段仅在用户下的Sonata管理区域内更新,因此不需要在编辑配置文件表单中提供这些字段。我无法通过Sonata用户管理器更新这些字段,并尝试了几种不同的方法在Application \ Sonata \ UserBundle中扩展/实现该类。有没有人遇到过这个,可以给我一个教程或一步一步的过程,以最简洁的方式来扩展新的用户实体?

3 个答案:

答案 0 :(得分:30)

1。创建一个新包

像AcmeUserBundle这样的东西。创建它并像平常一样注册它。

2。创建一个新的用户实体

然后创建一个扩展UserGroup的{​​{1}}和Sonata\UserBundle\Entity\BaseUser实体。您还应该添加主键的配置,例如:

Sonata\UserBundle\Entity\BaseGroup

3。配置实体

然后,转到您的/** * @ORM\Entity * @ORM\Table(name="fos_user") */ class User extends BaseUser { /** * @ORM\Id * @ORM\Column(type="integer") * @ORM\GeneratedValue(strategy="AUTO") */ protected $id; } 文件并配置这些新实体:

app/config/config.yml

4。覆盖UserAdmin类

然后,您需要创建一个新的UserAdmin类。要做到这一点,只需在您的包中创建一个新的sonata_user: class: user: Acme\UserBundle\Entity\User group: Acme\UserBundle\Entity\Group 类,扩展UserAdmin并覆盖这样的方法:

Sonata\UserBundle\Admin\Model\UserAdmin

5。替换旧的UserAdmin类

然后,您需要确保Sonata使用新的UserAdmin类。您只需将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() ; } } 参数设置为新课程即可!

sonata.user.admin.user.class

答案 1 :(得分:7)

我发现问题是一个学说问题。我的扩展包使用了原始的xml字段映射。我删除了这些文件并恢复了注释。从那里开始,一切都很出色。我希望这可以帮助遇到同样问题的其他人。

答案 2 :(得分:0)

这很容易,但SonataUserBundle documentation在这方面很短暂。基本上,在设置了herehere所述的两个包之后:

您需要创建一个类来扩展Sonata\UserBundle\Entity\BaseUser中的SonataUserBundle类。请注意,如果重写构造函数,仍然必须调用父对象的构造函数。

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

如果需要,您也可以以类似的方式覆盖Sonata\UserBundle\Entity\BaseGroup对象。

然后,编辑您的config.yml以匹配您的命名空间,例如

# 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

清除缓存。将使用您的实体而不是内置实体。