Zur Übersicht

Symfony 4 und Flex: Erkenntnisse beim Migrieren auf die neue Struktur

Andreas Allacher
Andreas Allacher Aktualisiert am 17. Aug. 2020
Symfony Blogbild

Jedes Symfony Projekt wird früher oder später auf die neue Symfony Flex Struktur angepasst werden. Hier sind einige meiner Erkenntnisse dazu. Als Symfony Entwickler findet man schnell die Dokumentation zum Upgrade auf Flex. Diese ist jedoch sehr allgemein und geht nicht auf diverse Details ein.

Konfiguration

Vor der Änderung gab es eine Datei im Symfony Projekt, welche die komplette Konfiguration geladen hat. So konnte man die Konfiguration nur aufteilen, indem man weitere Dateien importierte. Dies lässt sich prinzipiell auch mit der neuen Struktur so umsetzen, ist aber eigentlich nicht der gewünschte Weg. Stattdessen sollte die Konfiguration für die einzelnen Bundles aufgeteilt werden. Meine Vorgehensweise dazu war:

  • Bundles über Symfony Flex neu installieren, wodurch die Standardkonfiguration dieser erstellt wird und zwar gleich mit dem dafür vorgesehenen Namen.
  • Danach habe ich diese mit den Werten der ursprünglichen Konfiguration angepasst.

Services

Die Services der Applikation werden wie gehabt über eine Datei definiert, sie muss nur entsprechend verschoben werden. Für Bundles werden diese äquivalent zur Konfiguration verwaltet.

Routen

Für Routen gibt es jetzt einen eigenen Ordner, wo man diese auf mehrere Dateien sinnvoll aufteilen kann.

Variablen

Für variable Werte sollte man in Symfony Flex anstatt wie bisher mit Parametern zu arbeiten, diese über Umgebungsvariablen bereitstellen. Symfony stellt eine Komponente bereit, mit der man diese über eine .env Datei für die Applikation setzen kann. Die Grundidee dazu ist, in der Entwicklung damit zu arbeiten, um die Werte einfach ändern zu können und auf Produktivsystemen tatsächlich die Umgebungsvariablen zu setzen.
Darum haben wir uns im Team dazu entschlossen auch am Produktivsystem mit der .env Datei zu arbeiten:

  • Sie ist von unserer Seite aus einfacher wartbar 
  • Alle Variablen sind an einer Stelle zu finden 
  • Sie befindet sich direkt im Ordner der Applikation 
  • Man muss nicht erst herausfinden, wo diese am entsprechenden System gesetzt werden

Zusätzlich kann eine Beispiel-Datei im Git hinzugefügt werden, diese muss dan nur kopiert und entsprechend angepasst werden. Mit dieser Datei wird dann auch gesetzt, um welche Applikations-Umgebung es sich handelt. Das hat zur Folge, dass auch die Symfony Console die richtige Applikations-Umgebung verwendet, ohne dies extra angeben zu müssen.

Symfony 4.1: Unit Tests und Variablen

Um Variablen bei Unit-Tests bereitstellen zu können, werden diese standardmäßig direkt in der Konfigurationsdatei für die Tests angegeben. Diese Variablen müssen dann allerdings an unterschiedlichen Stellen warten und wenn man hier dann auch die Symfony Console ausführen muss, fehlen Parameter.

Stattdessen haben wir hierfür eine eigene .env Datei für Testzwecke ins Git gegeben, welche über ein kleines PHP Skript über die Konfiguraitondatei für Tests geladen wird – ähnlich wie in der Symfony Console. Wenn man hierfür auch eine Unterscheidung zwischen einer Distribution-Datei und einer lokalen Version macht, kann man diese Werte je nach System einfach anpassen.

Symfony 4.2: Variablen

Mit Symfony 4.2 ändert sich die Verwaltung der Variablen über .env Dateien minimal, da auch neue Funktionen hinzukommen. Unter anderem werden die Variablen dann automatisch bei Unit Tests berücksichtigt und eigene Variablen pro Umgebung können direkt definiert odert überschrieben werden. Außerdem ändert sich die Namensstruktur ein wenig. Näheres hierzu finden Sie hier.

Namespace für Klassen

Das AppBundle wurde entfernt, womit jetzt alle Klassen direkt im src liegen und als Namespace wird standardmäßig App und für Tests App\Tests verwendet. Für dieses Umbenennen nimmt man am besten die Funktion der IDE her. Man muss dies auch im composer.json noch die autoload Konfiguration entsprechend anpassen. Wenn die Applikation eine gute Test-Coverage hat, lässt sich danach einfach feststellen, ob das Umbenennen Probleme verursacht hat oder nicht.

Bundles

Die zu ladenden Bundles werden jetzt nicht mehr direkt im Applikations-Kernel definiert. Es gibt jetzt eine Konfigurationsdatei, wo angegeben wird für welche Umgebungen ein Bundle geladen wird.

Applikationsspezifische Konfiguration und Compiler Passes

Nachdem es in der neuen Struktur kein AppBundle mehr gibt, wird dies jetzt direkt im Kernel definiert.

Custom Mappings für Doctrine Entities

Aufgrund des fehlenden AppBundles, werden Custom Mappings für Doctrine Entities nicht mehr wie gehabt automatisch ausgelesen, sondern entsprechend dieser Anleitung definiert.

Templates

Für Templates gibt es jetzt einen eigenen Ordner. Templates von verwendeten Bundles kann man auch direkt darüber überschreiben, siehe Dokumentation. Es kann jedoch sein, dass dies bei manchen der existierenden Bundles noch nicht funktioniert. Der Grund ist, dass diese dann die Templates über eine eigene Logik laden, welche die neuen Ordner noch nicht richtig berücksichtigt. Das sollte aber mit Updates behoben werden.

Fazit

Ich finde die Änderungen gut, da sie für mehr Übersichtlichkeit sorgen. Ja, es war auch vorher schon möglich die Konfiguration mehrfach aufzuteilen, aber jetzt ist dies einfacher und standardmäßig bei neu installierten Bundles der Fall. Es ist jedoch mit etwas Aufwand verbunden die Struktur bei einem existierenden Projekt entsprechend anzupassen. Bei einem neuen Projekt sollte man natürlich gleich mit der neuen Struktur starten.

MASSIVE ART_Andreas Allacher_640x640_circle
Andreas Allacher
Web Developer