2016-05-21 6 views
0

Dies ist Follow-up von Referencing non-parameter entries in config.yml Frage ich gestern gefragt.Nicht-Parameter-Einträge in verteilten config.yml referenzieren

Angenommen, wir haben einen komplizierteren Fall, in dem für jede Entität eine .yml-Konfigurationsdatei vorhanden ist. In jedem gibt es die Einstellung security.role_hierarchy mit einer Hierarchie von Rollen, die zu dieser Entität gehören. Wie so:

#user.yml 
security: 
    role_hierarchy: &srh 
     ROLE_USER_SHOW: ~ 
     ROLE_USER_LIST: ~ 
     ROLE_USER_NEW: ~ 
     ROLE_USER_EDIT_OWN: ~ 
     ROLE_USER_EDIT: ROLE_USER_EDIT_OWN 
     ROLE_USER_SOFTDELETE_OWN: ~ 
     ROLE_USER_SOFTDELETE: ROLE_USER_SOFTDELETE_OWN 
     ROLE_USER_DELETE: ~ 
     ROLE_USER_FLAG: ~ 
     ROLE_USER_ALL: 
      - ROLE_USER_SHOW 
      - ROLE_USER_LIST 
      - ROLE_USER_NEW 
      - ROLE_USER_EDIT 
      - ROLE_USER_DELETE 
      - ROLE_USER_SOFTDELETE 
      - ROLE_USER_FLAG 

#group.yml 
security: 
    role_hierarchy: &srh 
     ROLE_GROUP_SHOW: ~ 
     ROLE_GROUP_LIST: ~ 
     ROLE_GROUP_NEW: ~ 
     ROLE_GROUP_EDIT: ~ 
     ROLE_GROUP_DELETE: ~ 
     ROLE_GROUP_ALL: 
      - ROLE_GROUP_SHOW 
      - ROLE_GROUP_LIST 
      - ROLE_GROUP_NEW 
      - ROLE_GROUP_EDIT 
      - ROLE_GROUP_DELETE 

easy_admin: 
    entities: 
     Group: 
      form: 
       fields: 
        - 
         property: 'roles' 
         type: choice 
         type_options: 
          expanded: true 
          multiple: true 
          choices: *srh 

Aber präsentierte Lösung verbindet nur choices zu security.role_hierarchy in group.yml und so verweist es nur ROLE_GROUP_* Rollen. Ich möchte choices mit zusammengeführtem Wert von security.role_hierarchy geliefert werden, so dass es ROLES_USER_*, ROLES_GROUP_* und alle anderen definierten Rollen hatte.

Ist das möglich?

+1

'&' und '*' am Anfang eines Skalars sind für Anker und Aliase in YAML reserviert und müssen im selben Dokument vorkommen (es kann mehrere Dokumente in einer Datei geben, aber jede Datei ist mindestens eine) YAML-Dokument). Bei den meisten YAML-Parsern kann man nicht einmal ein Element nach dem Namen des Ankers finden (Ausnahme ist mein ruamel.yaml-Parser für Python im round_trip-Modus). symfony2 kann dies nicht für Sie mit dieser Syntax lösen, aber vielleicht hat es eine andere Art (d. h. Syntax) von Querverweisen von Daten aus verschiedenen YAML-Dokumenten. – Anthon

Antwort

1

So habe ich es geschafft, es selbst zu tun. Wie @Anthon sagte, & und * sind hier nicht von Nutzen. Wir müssen es über Symfony tun. Hier ist wie:

Ich benutze security.role_hierarchy als mergable Punkt der Sicherheitshierarchie zu definieren - und eine Liste der Rollen in der Anwendung verwendet. Ich lasse Auswahlfeld mit undefinierten Entscheidungen, etwa so:

  - 
       property: 'roles' 
       type: choice 
       type_options: 
        expanded: true 
        multiple: true 

Dann benutze ich eine Methode in der Steuerung die Auswahl einzurichten:

// AppBundle/Controller/AdminController.php 
public function indexAction(Request $request) 
{ 
    $choices = [];$preferred = []; 
    $vals = array_keys($this->container->getParameter('security.role_hierarchy.roles')); 
    $choices = $vals; 
    // actually there is some beautifying of $choices but it's not that important 
    // get $formBuilder and... 
    $formBuilder->add('roles', ChoiceType::class, ['choices'=>array_combine($choices, $vals), 'multiple'=>true, 'expanded'=>false]); 
    return $formBuilder; 
} 

ich aufhörte $formBuilder Schöpfung, weil ich es in einer Art und Weise tat Geeignet für EasyAdmin, in anderen Fällen gäbe es andere Möglichkeiten, dies zu tun.

Es könnte eine andere Art und Weise, es zu tun, aber es ist chaotisch: die security.role_hierarchy in der Steuerung erhalten, zu verarbeiten, wie Sie mögen und dann ordnen Sie globalen Variable Twig:

// AppBundle/Controller/AdminController.php 
public function indexAction(Request $request) 
{ 
    $vals = array_keys($this->container->getParameter('security.role_hierarchy.roles')); 
    $this->container->get('twig')->addGlobal("_security_roles", $vals); 
    // ... 
} 

Dann entsprechenden Zweig Vorlage aktualisieren.

Aber ich mag keine unnötigen Globals, also habe es nicht ausgiebig getestet.

+0

Froh, dass Sie einen Weg gefunden haben, dies zu erledigen, sorry, dass ich nicht mehr helfen könnte – Anthon