Die SymfonyCon 2017 fand im schönen Rumänien, genauer in der zweitgrößten Stadt Cluj, statt und begeisterte nicht nur mit zahlreichen Talks rund um das Symfony Ecosystem, sondern auch mit der Vorstellung von Symfony 4.0 und dessen zahlreichen Neuerungen.
Symfony Flex
Eine der gravierendsten Neuerungen ist wohl die Einführung von Symfony Flex und die damit einhergehende weitere Modularisierung des Symfony Frameworks. Mit diesem neuen Composer Plugin, welches von Fabien Potencier begeistert vorgestellt wurde, ist es möglich eine Symfony Applikation auf der kleinstmöglichen Codebasis zu erstellen. Mittels sogenannter Rezepte (“Recipes”) können dabei, zentral von Symfony verwaltet, Konfigurationen und Abhängigkeiten auf einfache Art geladen und eingefügt werden. Beispielsweise wird mittels `composer req --dev profiler` sehr einfach der WebProfiler nachinstalliert. Dabei sind nun alle üblichen Aufgabe wie Registrieren der Bundles, Kopieren von Konfigurationen, Setzen von Umgebungsvariablen oder auch Ausführen von nachgelagerten Prozessen automatisiert und die Komponente kann sofort genutzt werden. Für eigene Bundles können in die Repositories auf Github auch eigene Rezepte per PullRequest eingereicht werden.
Dafür notwendig ist ein manifest.json - File (Bsp: SwiftmailerBundle):
{ "bundles": { "Symfony\\Bundle\\SwiftmailerBundle\\SwiftmailerBundle": ["all"] }, "copy-from-recipe": { "config/": "%CONFIG_DIR%/" }, "env": { "MAILER_URL": "smtp://localhost:25?encryption=&auth_mode=" }, "aliases": ["mailer", "mail"] }
weitere Beispiele für Symfony Flex Recipes:
- `composer req webserver` → PHP Webserver
- `composer req cli` → Symfony Console
- `composer req admin` → Backend für einfache CRUD (create, edit, update, delete) Operationen
Eine komplette Auflistung aller Rezepte gibt es hier.
Die Verschlankung des Grundsystems geht somit mit einer einfachen Möglichkeit einher, die benötigten Pakete nachzuinstallieren und somit problemlos von einer kleinen Applikation ausgehend wachsen zu können ohne sich initial an zu viele Abhängigkeiten zu binden. Auch an der Struktur einer Symfony App hat sich einiges geändert. Es gibt keine /app Ordner mehr und die Konfigurationen liegt nun in einem eigenen Verzeichnis. Die parameters.yml weicht Environment-Variablen und .ENV Dateien, was sicher Applikationen die in einem Container beheimatet sind zu gute kommt. /web heißt nun /public, ist seiner Funktion aber treu geblieben. Den Ordner für Twig-Templates findet man nun unter /templates, UnitTest unter /test und den Source Code seiner Application unter /src. Es stellt sich hier fast die Frage, wieso es je anders war.
Zumindest sollte die Struktur so eingängiger sein und somit auch Anfängern den Einstieg erleichtern.
Eine Anleitung, die schrittweise die Einrichtung eines Symfony 4 Projektes erklärt findet man hier.
Bundles obsolet
Eine weitere Neuerung ist ebenfalls eine Empfehlung keine Bundles mehr im projektbezogenen Context (unter “/src”) einzusetzen.
Umgebungsvariablen (dotenv)
Über die dotenv-Komponente lassen sich Konfigurationen per Umgebungsvariablen vornehmen. Somit ist die Möglichkeit gegeben, die Umgebung komfortabel für Container Dienste wie Docker oder rkt von CoreOS nutzen zu können.
Zu den einzelnen Talks:
Decoupling an application with message queues
In diesem Talk sprach David Buchmann über die Verwendung einer Message Queue und der immer mehr Beachtung findenden Event-basierten Programmierung die in Sprache wie JavaScript schon länger etabliert ist. Dabei stellt der Sender eine Nachricht in eine Warteschlange, die dann von 1 oder mehreren Empfängern erhalten und abgearbeitet werden können. Das Format der Nachricht ist nicht vorgegeben und der Austausch kann nicht nur plattformübergreifend, sondern auch sprachübergreifend geschehen.
Die Vorteile dabei sind klar:
- Entkopplung und damit das Lösen von Abhängigkeiten Redundanz - die Nachrichten können erneut gesendet werden und gehen nicht verloren, solange sie nicht vom Empfänger bestätigt sind
- Skalierbarkeit - die Aufgaben können bei Bedarf verteilt werden
- Asynchronität - der Sender muss nicht auf eine Antwort warten
Neo4j + PHP = <3
Als Alternative zu relationalen Datenbanken stellte Michelle Sanver enthusiastisch die Graphdatenbank Neo4j vor. In der Einleitung interessant zu hören war, dass relationale Datenbanken nicht gut darin sind, Relationen abzubilden und effizient zu durchsuchen. Hier versprechen graphenbasierte Datenbanken wie Neoj4 eine bessere Integration in objektorientierte Sprachen.
Die Stärken der Datenbank liegen im Darstellen und Beschreiben von komplexen Beziehungen zwischen Entitäten. Diese werden in einer Netzstruktur abgelegt und unterteilen sich in Kanten, Knoten und Attribute, wobei Kanten die Verbindungen zwischen den Knoten darstellen und Attribute die Informationen in den einzelnen Knoten sind. Mit Algorithmen lassen sich dann Hotspots oder auch die kürzesten Pfade zwischen 2 Konten berechnen. Dabei wird für die Kommunikation die deklarative Sprache “Cypher” benutzt, dessen Syntax einer SQL Abfrage sehr ähnlich ist.
Zusammengefasst stellen Graphendatenbanken eine sehr interessante Alternative zur relationalen Datenbank dar, vor allem in Bereichen, in denen die Abbildung der Datenstruktur netzförmigen Charakter hat.
Discovering and solving performance issues
Denis Brumann sprach in diesem Talk über ein Problem, dem sich früher oder später fast jede größere Applikation gegenüber steht. Doch zum Glück gibt es eine Reihe von Tools, die helfen, den Performance-Problemen auf die Schliche zu kommen. Dabei steht am Anfang die Analyse und Identifizierung des Problems, denn, so Brumann, ist es ein wichtiger Punkte, keine Änderunge zu machen, ohnen einen Grund. Zudem sollte man auch nur in kleinen Schritten vorgehen und danach direkt die Auswirkung testen. Dies wiederholt man solange, bis das gewünschte Resultat eingetreten ist.
An alle Entwickler richtet er dann noch den Hinweis, den Code nicht vorab krampfhaft auf Geschwindigkeit zu optimieren, sondern sich an die Design Prinzipien zu halten und in erster Linie wart- und lesbaren Code zu schreiben. Sogenannte micro-optimizations bringen oft keine spürbare Verbesserung der Anwendung.
Die dabei gezeigten Hilfswerkzeuge Analyse sind die Console im Browser, der Symfony Profiler, JMeter von Apache und natürlich das Symfony-eigene Performance Testing Tool Blackfire.
Eine wesentlich Gewinn an Performance bringt auch PHP selbst in Version 7 mit. Und wer noch der einen oder anderen PHP 5.x Anwendung etwas Beine machen möchte, kann mit einem Update hier schon merklich Erfolge erzielen.
Seitenaufruf ohne Symfony Proxy: PHP in Version 7 zieht mit Facebooks HipHop VM gleich bzw. ist leicht im Vorteil, vor allem aber die Speicherbelegung wurde gegenüber PHP 5.6 drastisch verbessert. (Quelle Grafik: symfony.fi)
___
Eine wichtige Frage abschließend: Wo wird die nächste SymfonyCon 2018 stattfinden?
Die Antwort: Lissabon, Portugal.
Alle Videos zu den Talks werden (hoffentlich) bald auf YouTube verfügbar sein: www.youtube.com/user/SensioLabs