2016-09-10 4 views
2

Ich mache Benutzer des Sonata-Benutzerpakets. Laut der Dokumentation unter Abschnitt 2.5 Extending the Bundle möchte ich, dass ich ein komplettes neues Paket für meine Benutzer- und Gruppenentitäten erzeuge. Ich denke, das ist völlig unnötig und ich will dieses extra Bündel nicht. Also habe ich meine Benutzer- und Gruppenentitäten in meinem AppBundle erstellt und ich erweitere sie von den Sonata \ UserBundle \ Entity \ BaseUser -Entitäten.Sonata-Benutzerdienste überschreiben Menügruppe

Danach habe ich meine fos_user user_class und group_class in meine neuen Entitäten geändert.

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 

Alles funktioniert perfekt, meine Benutzer- und Gruppen Tabellen in meiner Datenbank korrekt erzeugt werden, kann ich den Benutzer durch die fos Benutzerbefehlszeile erstellen, und ich kann mich anmelden.

Im Menü ist ein automatisch generierte Benutzergruppe, die die Benutzer- und Gruppenentitäten enthält (siehe Bild unten). Jetzt besteht das einzige Problem darin, die Dienste für diese Entitäten zu überschreiben, damit sie meine eigenen Entity-Klassen verwenden können, denn wenn ich jetzt auf einen von ihnen klicke, wollen sie die Entitäten im erweiterten Bundle, die ich nicht haben will. Wie kann ich Sonate dazu bringen, meine eigenen Dienste zu nutzen? Oder wie kann ich die Benutzer (mit Benutzern und Gruppen) einfach komplett entfernen oder verstecken?

enter image description here

Antwort

1

Nach einigem Graben in Sonata User-Bundle-Dateien, ich sehe, dass die Einheiten mit einem Parameter eingestellt werden können. Also musste ich nur hinzufügen;

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

in meiner Datei config.yml.

1

"Oder sogar, wie kann ich nur die Benutzer (mit Benutzern und Gruppen) vollständig entfernen oder verstecken?"

Also, wir haben SonataUserBundle und unsere AppBundle. In beiden haben wir Benutzer und Gruppenentität. Und wir wollen keine Entitäten aus Sonaten verwenden - wir erweitern sie einfach. SonataUserBundle hat jedoch bereits die Klassen UserAdmin und GroupAdmin installiert. Deshalb, nach SonataUserBundle im Admin-Menü zwei Dienste Installation erscheinen:

enter image description here

Wie Sie wissen, Klasse jeder Sonate Admin wir in der services.yml Datei deklarieren. In SonataUserBundle haben wir eine andere Dateien, die Sonate Entwickler Dienstleistungen in erklären Bei Lehre ORM wir admin_orm.xml Datei aussehen sollte, die in diesem Pfad liegt.

vendor/sonata-project/user-bundle/Resources/config/admin_orm.xml 

Innerhalb der Datei, die wir die finden Erklärung der Admin-Dienste - Admin und 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> 

Wie Sie die ids unserer Dienstleistungen sehen hier können:

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

Die einfachste Methode, sie zu überschreiben, besteht darin, die gleichen Dienste (ich meine, wir verwenden diese IDs) in unserer Datei services.yml zu erstellen. Ja, Sie können mit mir streiten, dass diese Methode dumm ist, aber wie gesagt, es ist nicht die einzige.

So Sonata Dienstleistungen in unseren services.yml Willen sieht wie folgt aus:

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%" ] ] 

Jetzt können Sie das Admin-Dashboard aktualisieren und sehen, dass nichts passiert. Aber unser Ziel war es, diesen Dienst über unser Dashboard und Menü zu deaktivieren. Lass uns den Trick machen. Hinzufügen

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

an die Deklaration dieses Dienstes in services.yml.

Deshalb sind unsere Dienstleistungen wie folgt aussehen:

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%" ] ] 

Nach dieser trivialen Manipulationen Sonata Dienste werden vollständig von Ihrem Armaturenbrett verschwinden.