我正在扩展 Sonata 用户包并在新用户实体中创建一些额外的字段。这些字段只会在用户下的 Sonata 管理区域内更新,因此它们不需要在编辑配置文件表单中可用。我无法通过 Sonata 用户管理器更新这些字段,并尝试了几种不同的方法来扩展/实现 Application\Sonata\UserBundle 中的该类。有没有人遇到过这种情况,可以给我一个教程或一步一步的过程来扩展新的用户实体的最干净的方法?
3 回答
1.创建一个新包
像 AcmeUserBundle 之类的东西。像往常一样创建并注册它。
2.创建一个新的用户实体
然后创建一个扩展and的User
andGroup
实体。您还应该添加主键的配置,例如: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;
}
3.配置实体
然后,转到您的app/config/config.yml
文件并配置这些新实体:
sonata_user:
class:
user: Acme\UserBundle\Entity\User
group: Acme\UserBundle\Entity\Group
4. 覆盖 UserAdmin 类
然后,您需要创建一个新的 UserAdmin 类。为此,只需UserAdmin
在您的包中创建一个新类,扩展Sonata\UserBundle\Admin\Model\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()
;
}
}
5.替换旧的UserAdmin类
然后,您需要确保 Sonata 使用新的 UserAdmin 类。您只需将sonata.user.admin.user.class
参数设置为您的新类并准备好!
# app/config/config.yml
parameters:
sonata.user.admin.user.class: Acme\UserBundle\Admin\UserAdmin
我发现这个问题是一个教义问题。我的扩展包使用了原始的 xml 字段映射。我删除了这些文件并恢复为注释。从那里开始一切都很顺利。我希望这可以帮助遇到同样问题的其他人。
这很容易,但是SonataUserBundle
文档很短。基本上,按照此处和此处所述设置两个捆绑包后:
您需要创建一个类来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
清除缓存。将使用您的实体而不是内置实体。