Symfony 覆盖Sonata用户服务菜单组

Symfony 覆盖Sonata用户服务菜单组,symfony,sonata-admin,sonata,sonata-user-bundle,Symfony,Sonata Admin,Sonata,Sonata User Bundle,我使用Sonata用户包。根据第节下的文档,他们希望我为我的用户和组实体生成一个完整的新捆绑包。我认为这是完全没有必要的,我不想要那个额外的包。因此,我在AppBundle中创建了我的用户和组实体,并从Sonata\UserBundle\Entity\BaseUser实体扩展了它们 在此之后,我将fos_user_类和group_类更改为我的新实体 fos_user: db_driver: orm firewall_name: main user_class:

我使用Sonata用户包。根据第节下的文档,他们希望我为我的用户和组实体生成一个完整的新捆绑包。我认为这是完全没有必要的,我不想要那个额外的包。因此,我在AppBundle中创建了我的用户和组实体,并从Sonata\UserBundle\Entity\BaseUser实体扩展了它们

在此之后,我将fos_user_类和group_类更改为我的新实体

fos_user:
    db_driver:      orm
    firewall_name:  main
    user_class:     AppBundle\Entity\User

    group:
        group_class:   AppBundle\Entity\Group
        group_manager: sonata.user.orm.group_manager

    service:
        user_manager: sonata.user.orm.user_manager
一切正常,我的数据库中的用户和组表生成正确,我可以通过fos用户命令行创建用户,我可以登录

菜单中是自动生成的用户组,其中包含用户和组实体(请参见下图)。现在唯一的问题是重写这些实体的服务,让它们使用我自己的实体类,因为当我现在单击其中一个实体时,它们希望扩展包中的实体是我不想要的。我怎样才能让索纳塔利用我自己的服务呢?甚至,我怎样才能完全删除或隐藏用户(包括用户和组)


在深入研究Sonata用户包文件后,我发现可以使用参数设置实体。所以我所要做的就是补充

parameters:
    sonata.user.admin.user.entity: AppBundle\Entity\User
    sonata.user.admin.group.entity: AppBundle\Entity\Group
在我的config.yml文件中

“甚至,我怎样才能完全删除或隐藏用户(包括用户和组)

我们有SonataUserBundle和AppBundle。 在这两者中,我们都有用户和组实体。我们不想使用索纳塔中的实体——我们只是扩展它们。但是SonataUserBundle已经有了UserAdmin和GroupAdmin类。 这就是为什么在“管理”菜单中安装SonataUserBundle后会出现两个服务:

sonata.user.admin.user
sonata.user.admin.group

正如您所知,我们在services.yml文件中声明的每个sonata管理类。 在SonataUserBundle中,我们有另一个文件,sonata开发人员在其中声明服务。在使用条令orm的情况下,我们应该查看admin_orm.xml文件,该文件位于以下路径:

vendor/sonata-project/user-bundle/Resources/config/admin_orm.xml
在该文件中,我们可以找到管理服务的声明-UserAdmin和GroupAdmin:

<?xml version="1.0" encoding="UTF-8"?>
<container xmlns="http://symfony.com/schema/dic/services"         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xsi:schemaLocation="http://symfony.com/schema/dic/services     http://symfony.com/schema/dic/services/services-1.0.xsd">
    <parameters>
    <parameter     key="sonata.user.admin.groupname">sonata_user</parameter>
        <parameter     key="sonata.user.admin.label_catalogue">SonataUserBundle</parameter>
        <parameter key="sonata.user.admin.groupicon"><![CDATA[<i class='fa fa-users'></i>]]></parameter>
</parameters>
<services>
    <service id="sonata.user.admin.user" class="%sonata.user.admin.user.class%">
        <tag name="sonata.admin" manager_type="orm" group="%sonata.user.admin.groupname%" label="users" label_catalogue="%sonata.user.admin.label_catalogue%" label_translator_strategy="sonata.admin.label.strategy.underscore" icon="%sonata.user.admin.groupicon%"/>
        <argument/>
        <argument>%sonata.user.admin.user.entity%</argument>
        <argument>%sonata.user.admin.user.controller%</argument>
        <call method="setUserManager">
            <argument type="service" id="fos_user.user_manager"/>
        </call>
        <call method="setTranslationDomain">
            <argument>%sonata.user.admin.user.translation_domain%</argument>
        </call>
    </service>
    <service id="sonata.user.admin.group" class="%sonata.user.admin.group.class%">
        <tag name="sonata.admin" manager_type="orm" group="%sonata.user.admin.groupname%" label="groups" label_catalogue="%sonata.user.admin.label_catalogue%" label_translator_strategy="sonata.admin.label.strategy.underscore"/>
        <argument/>
        <argument>%sonata.user.admin.group.entity%</argument>
        <argument>%sonata.user.admin.group.controller%</argument>
        <call method="setTranslationDomain">
            <argument>%sonata.user.admin.group.translation_domain%</argument>
        </call>
    </service>
</services>
覆盖它们的最简单方法是在services.yml文件中创建相同的服务(我的意思是我们将使用这个ID)。 是的,你可以和我争论,这种方法很愚蠢,但正如我说的,它不是唯一的方法

因此,我们services.yml中的索纳塔服务将如下所示:

sonata.user.admin.user:
    class: "%sonata.user.admin.user.class%"
    arguments: [~, "%sonata.user.admin.user.entity%", "%sonata.user.admin.user.controller%"]
    tags:
        - { name: sonata.admin, manager_type: orm, group: "%sonata.user.admin.groupname%", label_catalogue: "%sonata.user.admin.label_catalogue%", label: "users", icon: "<i class=\"fa fa-users\"></i>" }
    calls:
        - [ setUserManager, [ "@fos_user.user_manager" ] ]
        - [ setTranslationDomain, [ "%sonata.user.admin.user.translation_domain%" ] ]

sonata.user.admin.group:
    class: "%sonata.user.admin.group.class%"
    arguments: [~, "%sonata.user.admin.group.entity%", "%sonata.user.admin.group.controller%"]
    tags:
        - { name: sonata.admin, manager_type: orm, group: "%sonata.user.admin.groupname%", label_catalogue: "%sonata.user.admin.label_catalogue%", label: "groups" }
    calls:
        - [ setTranslationDomain, [ "%sonata.user.admin.group.translation_domain%" ] ]
sonata.user.admin.user:
    class: "%sonata.user.admin.user.class%"
    arguments: [~, "%sonata.user.admin.user.entity%", "%sonata.user.admin.user.controller%"]
    tags:
        - { name: sonata.admin, manager_type: orm, group: "%sonata.user.admin.groupname%", label_catalogue: "%sonata.user.admin.label_catalogue%", label: "users", icon: "<i class=\"fa fa-user\"></i>", show_in_dashboard: false }
    calls:
        - [ setUserManager, [ "@fos_user.user_manager" ] ]
        - [ setTranslationDomain, [ "%sonata.user.admin.user.translation_domain%" ] ]

sonata.user.admin.group:
    class: "%sonata.user.admin.group.class%"
    arguments: [~, "%sonata.user.admin.group.entity%", "%sonata.user.admin.group.controller%"]
    tags:
        - { name: sonata.admin, manager_type: orm, group: "%sonata.user.admin.groupname%", label_catalogue: "%sonata.user.admin.label_catalogue%", label: "groups", show_in_dashboard: false }
    calls:
        - [ setTranslationDomain, [ "%sonata.user.admin.group.translation_domain%" ] ]
sonata.user.admin.user:
类:“%sonata.user.admin.user.class%”
参数:[~,“%sonata.user.admin.user.entity%”,“%sonata.user.admin.user.controller%”
标签:
-{name:sonata.admin,manager\u type:orm,组:“%sonata.user.admin.groupname%”,标签目录:“%sonata.user.admin.label\u catalog%”,标签:“users”,图标:”}
电话:
-[setUserManager,[“@fos_user.user_manager”]]
-[setTranslationDomain,[%sonata.user.admin.user.translation\u domain%]”
sonata.user.admin.group:
类:“%sonata.user.admin.group.class%”
参数:[~,“%sonata.user.admin.group.entity%”,“%sonata.user.admin.group.controller%”
标签:
-{name:sonata.admin,manager\u type:orm,group:“%sonata.user.admin.groupname%”,label\u catalog:“%sonata.user.admin.label\u catalog%”,label:“groups”}
电话:
-[setTranslationDomain,[%sonata.user.admin.group.translation\u domain%]”
现在,您可以更新管理仪表板,并看到什么都没有发生。但我们的目的是从仪表板和菜单中禁用此服务。让我们玩这个把戏吧。加

show_in_dashboard: false
tags:
        - { show_in_dashboard: false, name: sonata.admin, manager_type: orm, group: "%sonata.user.admin.groupname%", label_catalogue: "%sonata.user.admin.label_catalogue%", label: "users", icon: "<i class=\"fa fa-user\"></i>" }
在仪表板中显示仪表盘:false
标签:
-{show_in_dashboard:false,name:sonata.admin,manager_type:orm,group:“%sonata.user.admin.groupname%”,label_catalog:“%sonata.user.admin.label_catalog%”,label:“users”,图标:“}
在services.yml中声明此服务

因此,我们的服务将如下所示:

sonata.user.admin.user:
    class: "%sonata.user.admin.user.class%"
    arguments: [~, "%sonata.user.admin.user.entity%", "%sonata.user.admin.user.controller%"]
    tags:
        - { name: sonata.admin, manager_type: orm, group: "%sonata.user.admin.groupname%", label_catalogue: "%sonata.user.admin.label_catalogue%", label: "users", icon: "<i class=\"fa fa-users\"></i>" }
    calls:
        - [ setUserManager, [ "@fos_user.user_manager" ] ]
        - [ setTranslationDomain, [ "%sonata.user.admin.user.translation_domain%" ] ]

sonata.user.admin.group:
    class: "%sonata.user.admin.group.class%"
    arguments: [~, "%sonata.user.admin.group.entity%", "%sonata.user.admin.group.controller%"]
    tags:
        - { name: sonata.admin, manager_type: orm, group: "%sonata.user.admin.groupname%", label_catalogue: "%sonata.user.admin.label_catalogue%", label: "groups" }
    calls:
        - [ setTranslationDomain, [ "%sonata.user.admin.group.translation_domain%" ] ]
sonata.user.admin.user:
    class: "%sonata.user.admin.user.class%"
    arguments: [~, "%sonata.user.admin.user.entity%", "%sonata.user.admin.user.controller%"]
    tags:
        - { name: sonata.admin, manager_type: orm, group: "%sonata.user.admin.groupname%", label_catalogue: "%sonata.user.admin.label_catalogue%", label: "users", icon: "<i class=\"fa fa-user\"></i>", show_in_dashboard: false }
    calls:
        - [ setUserManager, [ "@fos_user.user_manager" ] ]
        - [ setTranslationDomain, [ "%sonata.user.admin.user.translation_domain%" ] ]

sonata.user.admin.group:
    class: "%sonata.user.admin.group.class%"
    arguments: [~, "%sonata.user.admin.group.entity%", "%sonata.user.admin.group.controller%"]
    tags:
        - { name: sonata.admin, manager_type: orm, group: "%sonata.user.admin.groupname%", label_catalogue: "%sonata.user.admin.label_catalogue%", label: "groups", show_in_dashboard: false }
    calls:
        - [ setTranslationDomain, [ "%sonata.user.admin.group.translation_domain%" ] ]
sonata.user.admin.user:
类:“%sonata.user.admin.user.class%”
参数:[~,“%sonata.user.admin.user.entity%”,“%sonata.user.admin.user.controller%”
标签:
-{name:sonata.admin,manager\u type:orm,组:“%sonata.user.admin.groupname%”,标签目录:“%sonata.user.admin.label\u catalog%”,标签:“users”,图标:”,在仪表板中显示:false}
电话:
-[setUserManager,[“@fos_user.user_manager”]]
-[setTranslationDomain,[%sonata.user.admin.user.translation\u domain%]”
sonata.user.admin.group:
类:“%sonata.user.admin.group.class%”
参数:[~,“%sonata.user.admin.group.entity%”,“%sonata.user.admin.group.controller%”
标签:
-{name:sonata.admin,manager\u type:orm,group:“%sonata.user.admin.groupname%”,label\u目录:“%sonata.user.admin.label\u目录%”,label:“groups”,在仪表板中显示\u:false}
电话:
-[setTranslationDomain,[%sonata.user.admin.group.translation\u domain%]”
在这些琐碎的操作之后,Sonata服务将从您的仪表板中完全消失