Php 扩展Sonata用户包并添加新字段
我正在扩展Sonata用户包,并在新的用户实体中创建一些额外的字段。这些字段将仅在用户下的Sonata管理区域内更新,因此它们不需要在编辑配置文件表单中可用。我在通过Sonata用户管理器更新这些字段时遇到问题,并尝试了几种不同的方法在Application\Sonata\UserBundle中扩展/实现该类。以前有没有人遇到过这种情况,可以给我一个教程或一步一步的过程,以最干净的方式扩展新的用户实体 这很容易,但在这方面的研究还很欠缺。基本上,在按照所述和所述设置两个捆绑包之后: 您需要创建一个类来扩展Php 扩展Sonata用户包并添加新字段,php,symfony,symfony-sonata,Php,Symfony,Symfony Sonata,我正在扩展Sonata用户包,并在新的用户实体中创建一些额外的字段。这些字段将仅在用户下的Sonata管理区域内更新,因此它们不需要在编辑配置文件表单中可用。我在通过Sonata用户管理器更新这些字段时遇到问题,并尝试了几种不同的方法在Application\Sonata\UserBundle中扩展/实现该类。以前有没有人遇到过这种情况,可以给我一个教程或一步一步的过程,以最干净的方式扩展新的用户实体 这很容易,但在这方面的研究还很欠缺。基本上,在按照所述和所述设置两个捆绑包之后: 您需要创建一
SonataUserBundle
中的Sonata\UserBundle\Entity\BaseUser
类。请注意,如果重写构造函数,则仍然必须调用父对象的构造函数
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
清除缓存。将使用您的实体而不是内置实体。1。创建一个新包
类似于AcmeUserBundle的东西。像平常一样创建并注册它
2.创建新的用户实体
然后创建一个User
和Group
实体,扩展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类。为此,只需在bundle中创建一个新的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字段映射。我删除了那些文件并恢复到注释。从那以后,一切都很顺利。我希望这能帮助遇到同样问题的其他人。我实际上已经完成了这些步骤。当我用新属性扩展User entity类,然后希望这些属性在Sonata管理区域内的“更新”中更新时,我的问题就出现了。preUpdate()函数没有更新新字段。您知道如何将其他参数注入此管理类吗?我没有看到相关的服务。@PierredeLESPINAY只需覆盖
sonata.user.admin.user
我们必须重新定义所有值吗?标签、参数。。。你是否有一个YML的例子?你能提供任何链接来详细说明这个设置过程吗?是的,但是它们会在Sonata管理区使用吗?这就是发生在我身上的事情。实体在任何前端区域都能正常工作,但在管理区域不能正常工作。@JustinGriffith,这些字段是否显示在实体的编辑表单中?如果是,单击“更新”时会发生什么情况?如果您可以编辑您的问题以发布config.yml
(减去私有数据)和AppKernel.php
文件,这会有所帮助。请尽可能准确地描述问题。@JustinGriffith顺便说一句,要使用preUpdate()
(如Wouter J对答案的评论所述),您需要使用HasLifeCycleCallbacks
,如详细说明所示。