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

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

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

  • 是否可以覆盖 Sonata User 实体以获取一些无用的属性?怎么办?

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

Sonata Group Add

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

  • 这可能吗?如何?有什么解决办法吗?

我看了一下Github here和文档 here但找不到任何有用的东西。有什么建议吗?

最佳答案

您可以通过直接扩展 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以防万一我忘记了什么或者你需要更多。

关于php - 如何覆盖 SonataUser 实体属性和表单?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35678017/

相关文章:

php - 我如何使用 php 和 mysql 上传音乐

php - 如何在 Heroku 中的 Laravel 中缓存配置?即构建与运行时不同的路径

php - 在 Doctrine 映射中为表设置 PostgreSQL 模式很热吗?

带有 POST 数据的 PHP Symfony 重定向

symfony - 自定义Sonata-admin仪表板 "home"

php - PDO 变量不适用于 sql 限制代码

php - 使用 PHPExcel 加载包含图像的 Excel 文件

php - 根据最新的关联对象查询

symfony - 覆盖用户管理表单

php - 将角色分组到一个奏鸣曲形式的复选框中