Wie kann ich einen Parameter in Symfony2 dynamisch festlegen?

8

Ich versuche, einen Parameter dynamisch in Symfony2 zu setzen (das kann ich nicht statisch in meiner parameters.yml Datei setzen). Mein Ansatz ist die Verwendung eines EventListener :

%Vor%

Und meine Service Definition in config.yml sieht so aus:

%Vor%

Das Problem ist, ich bekomme eine Ausnahme:

  

LogicException: Unmöglich, set () auf einem eingefrorenen ParameterBag aufzurufen.

Wie kann ich diese Ausnahme umgehen oder sehen Sie eine andere Möglichkeit, einen Parameter dynamisch zu setzen?

    
Gottlieb Notschnabel 18.04.2014, 15:09
quelle

3 Antworten

8

Die Regel der Containerparameter lautet:

  

Sie können nur einen Parameter festlegen, bevor der Container kompiliert wird

Wie Sie das Problem beheben können, hängt von Ihren Anforderungen ab, mit der Prämisse, dass der Container keine dynamischen Parameter hat.

  1. erstellen Sie benutzerdefinierte dynamische "Optionen" -Service und injizieren es in anderen Diensten, auf diese Weise können Sie auch Ihre Parameter in der Datenbank verwalten (wie Wordpress wp_options), aber ich kenne kein Bündel, das dies tun. Für bestehende Dienste (zB Mailer) können Sie Konfiguratoren verwenden .

  2. macht den Cache ungültig, wenn sich Parameter ändern hier eine einfache Methode Wenn Sie die Seite neu laden, wird der Container neu erstellt. Wenn sich die Parameter häufig ändern, besteht die Gefahr, dass der Cache häufig neu geladen wird, und dies wird zu einem Problem, wenn Sie große Lasten haben.

Wenn Sie die zweite Option auswählen, müssen Sie die Parameter festlegen, bevor sie in den Container eingegeben werden. Sie können also:

  • exportiert in eine benutzerdefinierte yaml-Datei, die in app / config / config.yml geladen wird, wenn sich Parameter ändern, bevor Sie den Cache löschen, um auf diese Weise Daten von anderen Diensten zu erhalten
  • laden Parameter in einer Bundle-Erweiterung hier das Kochbuch , auf diese Weise können Sie nicht Zugriff auf andere Dienste, um die Daten zu erhalten, kann die Erweiterung nur auf den ContainerBuilder
  • zugreifen

Ich empfehle jedoch Option 1 (Optionsservice und Konfiguratoren), weil (ich wiederhole) der Container keine dynamischen Parameter hat, aber es bietet die Möglichkeit, benutzerdefinierte dynamische Service-Konfiguratoren zu haben, die Daten aus jeder Quelle verwenden.

    
Marino Di Clemente 18.04.2014, 17:59
quelle
1

Ich hatte das Problem in einer Liste von URLs, die mit %base_url% begannen, als ich ein Failover-System machen wollte.

Ich habe schließlich %base_url% durch #base_url# ersetzt und eine manuelle Platzhalterauflösung in einem Service durchgeführt.

%Vor%     
Alain Tiemblo 29.12.2014 13:52
quelle
0

Ich denke, wir können einem Dienst Parameter als einfache Klassenfunktionen hinzufügen.

Dies ist meine Controller-Funktion.

%Vor%

Das ist mein Service

%Vor%     
vimuth 26.01.2016 06:58
quelle