【问题标题】:Override Sonata Users services Menu Group覆盖 Sonata 用户服务菜单组
【发布时间】:2017-01-18 13:19:41
【问题描述】:

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

在此之后,我已将我的 fos_user user_class 和 group_class 更改为我的新实体。

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用户命令行创建用户,可以登录了。

菜单中有一个自动生成的用户组,其中包含用户和组实体(见下图)。现在唯一的问题是为这些实体覆盖服务以使用我自己的实体类,因为当我现在单击其中一个时,他们想要扩展包中的实体,而我不想要。我怎样才能告诉奏鸣曲使用我自己的服务?甚至,我怎样才能完全删除或隐藏用户(包括用户和组)?

【问题讨论】:

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


    【解决方案1】:

    在索纳塔用户捆绑文件中进行了一些挖掘之后,我看到可以使用参数设置实体。所以我所要做的就是添加;

    parameters:
        sonata.user.admin.user.entity: AppBundle\Entity\User
        sonata.user.admin.group.entity: AppBundle\Entity\Group
    

    在我的 config.yml 文件中。

    【讨论】:

      【解决方案2】:

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

      所以,我们有了 SonataUserBundle 和我们的 AppBundle。 在它们中,我们都有用户和组实体。而且我们不想使用奏鸣曲中的实体——我们只是扩展它们。但是 SonataUserBundle 里面已经有了 UserAdmin 和 GroupAdmin 类。 这就是为什么在管理菜单中安装 SonataUserBundle 后会出现两个服务:

      如您所知,我们在 services.yml 文件中声明的每个奏鸣曲管理类。 在 SonataUserBundle 中,我们有另一个文件,奏鸣曲开发人员在其中声明服务。如果使用学说 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>
      

      您可以在这里看到我们服务的 ID:

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

      覆盖它们的最简单方法是在我们的 services.yml 文件中创建相同的服务(我的意思是我们将使用这个 ids )。 是的,你可以和我争论,这种方法很愚蠢,但正如我所说,它不是唯一的。

      所以我们的 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%" ] ]
      

      现在您可以更新管理仪表板并查看,什么都没有发生。但我们的目的是从我们的仪表板和菜单中禁用此服务。让我们做的伎俩。添加

      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>" }
      

      在 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-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 服务将从您的仪表板中完全消失。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-03-21
        • 2016-04-20
        • 2017-08-21
        • 1970-01-01
        • 2018-04-13
        • 2015-11-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多