我正在扩展Sonata用户捆绑包并在新用户实体中创建一些额外的字段。这些字段仅在用户下的Sonata管理区域内更新,因此不需要在编辑配置文件表单中提供这些字段。我无法通过Sonata用户管理器更新这些字段,并尝试了几种不同的方法在Application \ Sonata \ UserBundle中扩展/实现该类。有没有人遇到过这个,可以给我一个教程或一步一步的过程,以最简洁的方式来扩展新的用户实体?
答案 0 :(得分:30)
像AcmeUserBundle这样的东西。创建它并像平常一样注册它。
然后创建一个扩展User
和Group
的{{1}}和Sonata\UserBundle\Entity\BaseUser
实体。您还应该添加主键的配置,例如:
Sonata\UserBundle\Entity\BaseGroup
然后,转到您的/**
* @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
然后,您需要创建一个新的UserAdmin类。要做到这一点,只需在您的包中创建一个新的sonata_user:
class:
user: Acme\UserBundle\Entity\User
group: Acme\UserBundle\Entity\Group
类,扩展UserAdmin
并覆盖这样的方法:
Sonata\UserBundle\Admin\Model\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在这方面很短暂。基本上,在设置了here和here所述的两个包之后:
您需要创建一个类来扩展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
清除缓存。将使用您的实体而不是内置实体。