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

How to override SonataUser entities properties and forms?

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

现在作为问题的第二部分并且与此相关,我想创建或使用我自己的表单来添加新用户 and/or 组,因为使用默认组我无法添加角色。请参阅下图以了解我在说什么:

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

我查看了 Github here and Docs here,但找不到任何有用的信息。有什么建议吗?

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

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

use Sonata\UserBundle\Model\User as BaseUser;

以下内容:

use FOS\UserBundle\Entity\User as BaseUser;

然后,要从表单中删除无用的属性并可能添加新的属性,请覆盖默认的 sonata UserAdmin class:

1- 在您自己的包中创建一个名为 UserAdmin 的管理员 class。

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

class 可以看起来像:

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 class 定义为服务

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 以防我忘记了什么或者你需要更多。