【问题标题】:Extending Sonata User Bundle and adding new fields [closed]扩展 Sonata 用户包并添加新字段 [关闭]
【发布时间】:2013-03-15 08:36:12
【问题描述】:

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

【问题讨论】:

    标签: php symfony symfony-sonata


    【解决方案1】:

    这很简单,但SonataUserBundle documentation 在这方面做得很短。基本上,按照herehere 所述设置两个捆绑包后:

    您需要创建一个类来扩展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
    

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

    【讨论】:

    • 是的,但是它们会在 Sonata Admin 区域中使用吗?这就是发生在我身上的事情。这些实体在任何前端区域都能正常工作,但在管理区域却不行。
    • @JustinGriffith,这些字段是否显示在您实体的编辑表单中?如果是,单击更新时会发生什么?如果您可以编辑您的问题以发布您的config.yml(减去私人数据)和AppKernel.php 文件,将会有所帮助。请尽量准确地描述问题。
    • @JustinGriffith 顺便说一句,要使用 preUpdate()(如 Wouter J 对答案的评论中所述),您需要使用 HasLifeCycleCallbacks,如详细说明,例如here.
    【解决方案2】:

    1。创建一个新包

    类似 AcmeUserBundle 的东西。像往常一样创建并注册它。

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

    然后创建一个扩展Sonata\UserBundle\Entity\BaseUserSonata\UserBundle\Entity\BaseGroupUserGroup 实体。您还应该添加主键的配置,例如:

    /**
    * @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
    

    【讨论】:

    • 我实际上已经完成了这些步骤。当我使用新属性扩展 User 实体类然后希望在 Sonata 管理区域内的“更新”上更新这些属性时,我的问题就出现了。 preUpdate() 函数不会更新新字段。
    • 你知道如何将其他参数注入这个管理类吗?我没有看到相关的服务。
    • @PierredeLESPINAY 只是覆盖sonata.user.admin.user
    • 我们是否必须重新定义所有值?标签,参数,...你在某处有 YML 示例吗?
    • 您能否提供详细说明此设置过程的链接?
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2017-04-22
      • 1970-01-01
      • 2015-04-29
      • 2016-12-02
      • 2022-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-11
      相关资源
      最近更新 更多