2016-03-19 12 views
0

Wie im Titel. Ich möchte Abschnitt in meiner Bundle-Konfiguration haben, die einmal aktiviert ist - es hätte einige Pflichtfelder. Derzeit weiß ich nicht, wie ich das erreichen soll. Ich habe versucht canBeEnabled() und canBeDisabled() Optionen wie hier beschrieben: . Aber ohne Glück. Ich meine, auch wenn Abschnitt deaktiviert ist, wenn es Pflichtfelder enthält - der Fehler wird ausgelöst. Was ich erreichen möchte, ist Fehler geworfen zu haben, wenn Felder NUR gefüllt werden, wenn Abschnitt aktiviert ist. Gibt es einen Weg, das zu erreichen?Symfony2: Bedingte Bündelkonfigurationsabschnitte mit erforderlichen Feldern

Meine Config-Validierung:

$rootNode 
     ->children() 
      ->arrayNode('defaults')->canBeDisabled() 
       ->children() 
        ->scalarNode('firewall')->isRequired()->cannotBeEmpty()->end() 
        ->scalarNode('user')->isRequired()->cannotBeEmpty()->end() 
        ->arrayNode('controllers') 
         ->children() 
          ->booleanNode('registration')->defaultTrue()->end() 
         ->end() 
        ->end() 
       ->end() 
      ->end() 

Und in meiner config:

mybundle: 
    defaults: 
     user: default 
     firewall: default 
     controllers: 
      registration: true 

ich in der Lage sein möchte "Defaults" zu deaktivieren, aber wenn dieser Abschnitt (was sollte aktiviert sein Standard): user und firewall sollten explizit festgelegt werden.

Antwort

0

Ihr Konfigurationsbaum funktioniert wie erwartet. Die einzige Änderung, die ich machen würde, ist, canBeDisabled() zu caBeEnabled() zu ändern. Obwohl das nur meine Meinung ist und wenig Unterschied macht. Ich denke, Sie können verwirren, wie es funktioniert.

Ihre Konfiguration:

mybundle: 
    defaults: 
     user: default 
     firewall: default 
     controllers: 
      registration: true 

wird den ganzen Baum für die Validierung verwenden. Die Ausgabe enthält einen zusätzlichen Schlüssel unter $sonfig['defaults']['enabled'], der auf "true" gesetzt ist. Gemäß Ihrem Konfigurationsbaum MÜSSEN sowohl user als auch firewall einen Wert enthalten.

Jetzt, Wenn Sie eine config.yml angeben:

mybundle: ~ 

Alles im defaults Zweig übersprungen. Das resultierende Array wird wie folgt aussehen: $sonfig['defaults']['enabled'] = false. Der Ausgabe werden keine Standardwerte hinzugefügt. Nichts. Der Schlüssel enabled ist eine schnelle Methode zur Erkennung.

Um einen Zweig zu aktivieren/deaktivieren, müssen Sie Ihr config.yml so restrukturieren, dass alle Parameter unter einem einzigen Schlüssel liegen. So etwas wie (ohne den Zweck des Bündels zu wissen, es ist schwierig, einen geeigneten Namen zu erraten):

mybundle: 
    access: 
     defaults: 
      user: default 
      firewall: default 
      controllers: 
       registration: true 

Dem dem Konfigurationsbaum aussehen wird:

$rootNode 
->children() 
    ->arrayNode('access') 
    ->canBeDisabled() 
     ->children() 
      ->arrayNode('defaults') 
       ->children() 
        ->scalarNode('firewall')->isRequired()->cannotBeEmpty()->end() 
        ->scalarNode('user')->isRequired()->cannotBeEmpty()->end() 
        ->arrayNode('controllers') 
         ->children() 
          ->booleanNode('registration')->defaultTrue()->end() 
         ->end() 
        ->end() 
       ->end() 
      ->end(); 

nun eine Konfiguration aussehen kann:

mybundle: 
    access: ~ 

oder sogar überhaupt nicht erklärt:

mybundle: 
    other_non_optional_key: foo 

Nebenbei bemerkt, mag ich nicht die Idee, eine zusätzliche Verschachtelungsebene verwenden zu müssen. Ich würde consider it a bug innerhalb canBeDisabled() wenn erforderliche Felder vorhanden sind. Sie können etwas Ähnliches erreichen, indem Sie isRequired() durch defaultValue() ersetzen und eine benutzerdefinierte Methode verwenden.

+0

Ok, aber ich möchte nur einen Zweig der Konfiguration deaktivieren, also möchte ich etwas wie: 'mybundle: defaults: ~'.Aber es funktioniert nicht, Zweig wird noch für erforderliche Felder validiert. –

+0

@ ŁukaszZaroda Aktualisierte Antwort – Twifty

+0

@ ŁukaszZaroda Ihre Frage wurde beantwortet. Vielleicht möchten Sie akzeptieren. – Twifty