Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 扩展Sonata用户包并添加新字段_Php_Symfony_Symfony Sonata - Fatal编程技术网

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

Php 扩展Sonata用户包并添加新字段,php,symfony,symfony-sonata,Php,Symfony,Symfony Sonata,我正在扩展Sonata用户包,并在新的用户实体中创建一些额外的字段。这些字段将仅在用户下的Sonata管理区域内更新,因此它们不需要在编辑配置文件表单中可用。我在通过Sonata用户管理器更新这些字段时遇到问题,并尝试了几种不同的方法在Application\Sonata\UserBundle中扩展/实现该类。以前有没有人遇到过这种情况,可以给我一个教程或一步一步的过程,以最干净的方式扩展新的用户实体 这很容易,但在这方面的研究还很欠缺。基本上,在按照所述和所述设置两个捆绑包之后: 您需要创建一

我正在扩展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
,如详细说明所示。