覆盖奏鸣曲用户服务菜单组
Override Sonata Users services Menu Group
我使用了 Sonata User Bundle。根据 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 user 命令行创建用户,并且可以登录。
菜单中是一个自动生成的用户组,其中包含用户和组实体(见下图)。现在唯一的问题是将此实体的服务覆盖到他们使用我自己的实体 类,因为当我现在单击其中一个时,他们想要我不想要的扩展包中的实体。我如何告诉 sonata 使用我自己的服务?或者,我怎样才能完全删除或隐藏用户(包括用户和组)?
在深入研究 Sonata User Bundle 文件后,我发现可以使用参数设置实体。所以我所要做的就是添加;
parameters:
sonata.user.admin.user.entity: AppBundle\Entity\User
sonata.user.admin.group.entity: AppBundle\Entity\Group
在我的 config.yml 文件中。
"Or even, how can I just remove or hide the Users (with Users and Groups) completely?"
所以,我们有了 SonataUserBundle 和我们的 AppBundle。
在它们中我们都有用户和组实体。而且我们不想使用奏鸣曲中的实体——我们只是扩展它们。但是 SonataUserBundle 里面已经有了 UserAdmin 和 GroupAdmin classes。
这就是为什么在管理菜单中安装 SonataUserBundle 后会出现两个服务:
如您所知,我们在 services.yml 文件中声明的每个奏鸣曲管理员 class。
在 SonataUserBundle 中,我们有另一个文件,sonata 开发人员在其中声明服务。在使用 doctrine 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 文件中创建相同的服务(我的意思是我们将使用此 ID)。
是的,你可以和我争论,这种方法很愚蠢,但正如我所说,它不是唯一的方法。
因此我们 services.yml 中的 Sonata 服务将如下所示:
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 服务将从您的仪表板中完全消失。
我使用了 Sonata User Bundle。根据 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 user 命令行创建用户,并且可以登录。
菜单中是一个自动生成的用户组,其中包含用户和组实体(见下图)。现在唯一的问题是将此实体的服务覆盖到他们使用我自己的实体 类,因为当我现在单击其中一个时,他们想要我不想要的扩展包中的实体。我如何告诉 sonata 使用我自己的服务?或者,我怎样才能完全删除或隐藏用户(包括用户和组)?
在深入研究 Sonata User Bundle 文件后,我发现可以使用参数设置实体。所以我所要做的就是添加;
parameters:
sonata.user.admin.user.entity: AppBundle\Entity\User
sonata.user.admin.group.entity: AppBundle\Entity\Group
在我的 config.yml 文件中。
"Or even, how can I just remove or hide the Users (with Users and Groups) completely?"
所以,我们有了 SonataUserBundle 和我们的 AppBundle。 在它们中我们都有用户和组实体。而且我们不想使用奏鸣曲中的实体——我们只是扩展它们。但是 SonataUserBundle 里面已经有了 UserAdmin 和 GroupAdmin classes。 这就是为什么在管理菜单中安装 SonataUserBundle 后会出现两个服务:
如您所知,我们在 services.yml 文件中声明的每个奏鸣曲管理员 class。 在 SonataUserBundle 中,我们有另一个文件,sonata 开发人员在其中声明服务。在使用 doctrine 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 文件中创建相同的服务(我的意思是我们将使用此 ID)。 是的,你可以和我争论,这种方法很愚蠢,但正如我所说,它不是唯一的方法。
因此我们 services.yml 中的 Sonata 服务将如下所示:
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 服务将从您的仪表板中完全消失。