如何覆盖SonataUser实体属性和表单?

时间:2016-02-28 02:29:57

标签: php symfony sonata-admin sonata sonata-user-bundle

我正在使用Symfony 2.7.x和Sonata Admin 2.3.x以及Sonata User建立一个全新的项目。默认情况下,Sonata添加了一堆无用的字段,我希望尽可能保持我的实体清洁。所以我的第一个问题是:

  • 为了获得一些无用的属性,可以覆盖Sonata用户实体吗?怎么样?

现在作为问题的第二部分并且与之相关我想创建或使用我自己的表单来添加新用户和/或组,因为默认情况下我无法添加角色。请看下面的图片,看看我在说什么:

Sonata Group Add

我应该可以从那里添加新的动态角色,但我不能。

  • 这可能吗?怎么样?任何解决方法?

我看过Github here和文档here,但找不到任何帮助。有什么建议吗?

2 个答案:

答案 0 :(得分:2)

您可以通过直接扩展FOSUserBundle实体而不是SonataUser用户模型来摆脱Sonata属性。

更改用户实际扩展的实体:

use Sonata\UserBundle\Model\User as BaseUser;

以下内容:

use FOS\UserBundle\Entity\User as BaseUser;

然后,要从表单中删除无用的属性并添加新的,请覆盖默认的奏鸣曲UserAdmin类:

1-在您自己的捆绑包中创建一个名为UserAdmin的管理类。

2-打开文件vendor / sonata-project / user-bundle / Admin / Model / UserAdmin.php并从中获取configureFormFields。将其粘贴到您自己的管理类中,并通过从基本表单构建器中删除无用字段来仅保留您需要的字段。

该课程可能如下:

use FOS\UserBundle\Model\UserManagerInterface;
use Sonata\AdminBundle\Admin\Admin;
use Sonata\AdminBundle\Form\FormMapper;

class UserAdmin extends Admin // You can extends directly from SonataUserAdmin if it's easier for you
{
    protected $userManager;

    protected function configureFormFields(FormMapper $formMapper)
    {
        $formMapper
           ... The fields you keep ...
    }

    /**
     * @param UserManagerInterface $userManager
     */
    public function setUserManager(UserManagerInterface $userManager)
    {
        $this->userManager = $userManager;
    }

    /**
     * @return UserManagerInterface
     */
    public function getUserManager()
    {
        return $this->userManager;
    }
}

3-将新的UserAdmin类定义为服务

services:
    sonata.user.admin.user:
        class: YourOwnAdminBundle\Admin\UserAdmin
        tags:
            - { name: sonata.admin, manager_type: orm, group: %sonata.user.admin.groupname%, label: "User", label_catalogue: %sonata.user.admin.label_catalogue%", icon: "%sonata.user.admin.groupicon%"}
        arguments:
            - ~
            - %sonata.user.admin.user.entity%
            - %sonata.user.admin.user.controller%
        calls:
            - [setUserManager, ["@fos_user.user_manager"]]
            - [setTranslationDomain, ["%sonata.user.admin.user.translation_domain%"]]

然后,在config.yml中调整sonata-user的配置:

sonata_user: 
    ...
    admin:
        user:
            class:          YourOwnAdminBundle\Admin\UserAdmin
            controller:     SonataAdminBundle:CRUD
            translation:    SonataUserBundle

它应该是好的。

如果我遗忘了某些内容或需要更多内容,请查看this similar question

答案 1 :(得分:-1)

据我所知,你不应该对SonataUserBundle的实体属性做任何事情,但如果你真的想删除你赢得的一些属性,你可以编辑SonataUserBundle的Model\User.php不需要;您必须小心,因为您将删除的属性可能会影响与这些属性关联的某些表单或函数。