Das Elixir MVC Framework Phoenix
Von Markus Krogemann und Marcel Wolf
Worum geht es?
Zunächst wird gezeigt, wie sich eine Webanwendung mit Phoenix in einfachen Schritten erstellen lässt, ohne dass ein tieferes Verständnis für eine funktionale Programmiersprache notwendig ist. Anhand einer Demoanwendung wird anschließend deutlich, wie Phoenix aufgebaut ist und welche Vorteile das Ökosystem um Elixir bietet. In weiteren Blogposts wird ein tieferer Einblick in das Framework und seine Komponenten gegeben, wie z.B Plug und Ecto. Besonders wird dabei auf die Anbindung der Dokumentendatenbank CouchDB eingegangen.
Phoenix, Elixir, CouchDB
Einleitung
Elixir ist eine funktionale Programmiersprache, die auf der Erlang BEAM (Bogdan/Björn’s Erlang Abstract Machine) aufsetzt. Zusammen mit Stilmitteln aus anderen Programmiersprachen (z.B Ruby) bietet sie einen einfachen Einstieg für Entwickler in die Erlangwelt.
Erlang ist eine funktionale Programmiersprache, die für die Programmierung von Anwendungen in der Telekommunikation konzipiert wurde und insbesondere in verteilten und nebenläufigen Systemen große Vorteile in Bezug auf Stabilität und Wartbarkeit bringt. Das Ökosystem um die funktionale Programmiersprache Elixir ist noch recht klein, wird aber von einer wachsenden Community von Enthusiasten belebt.
Phoenix
In dieser Community entstand auch Phoenix, ein in Elixir entwickeltes Webframework, um HTML5-Anwendungen, API-Backends und verteilte Systeme zu bauen.
CouchDB
Bei der Betrachtung von Phoenix fällt auf, dass es mit Ausnahme von MongoDB nur Adaptoren für relationale Datenbanken gibt. Um in dem Ökosystem von Erlang zu bleiben und die Vorteile einer dokumentbasierten Datenbank zu nutzen, bietet sich die Integration mit CouchDB an. CouchDB ist eine dokumentenbasierte und in Erlang programmierte NoSQL-Datenbank mit JSON-HTTP-Interface.
Die Herausforderung, dass es noch keinen passenden Datenbank-Connector gibt, hat uns zu dem Entschluss geführt, einen eigenen CouchDB-Connector in Elixir zu schreiben.
Bislang sind die Grundfunktionen create, update und read, sowie einige view-Basisoperationen implementiert. Das Open-Source-Projekt ist auf Github zu finden.
Start eines Projeks
Um ein neues Phoenixprojekt zu starten benutzen wir das Kommando mix phoenix.new, als Parameter wird der Name foo übergeben. Das Projekt wird ohne das Persistenzframework ecto gestartet (es wird nicht benötigt), daher muss der Parameter –no-ecto angegeben werden.
mix phoenix.new foo --no-ecto
Das Framework fragt nach ob die benötigten Abhängigkeiten installiert werden sollen oder nicht.
cd foo
Es besteht die Möglichkeit die Applikation in der interaktiven Shell oder als normalen Server zu starten. In diesem Beispiel wird die interaktive Version verwendet.
iex -S mix phoenix.server
Die leere Applikation wird gestartet und kann über den Browser erreicht werden http://localhost:4000
Live Reloading
Phoenix stellt eine sehr hilfreiche Live-Reload-Funktion bereit, mit der Änderungen an dem Projekt sofort kompiliert (wenn nötig) und geladen werden.
HTML-Seiten werden z.B. sofort geladen, ausprobiert werden kann es in folgender Datei:
web/templates/page/index.html.eex
Wir ändern den h2 Text von „Welcome to Phoenix!“ zu „Hello World!“.
In der interaktiven Session wird das live-reloading als Log-Eintrag sichtbar.
Ohne manuelles Neuladen der Seite wird die Änderung sofort im Browser sichtbar.
Projektstruktur
├── config
Im config-Ordner des Projekts wird die Konfiguration abgelegt, einige Dependencies (wie z.B. credo) suchen auch in diesem Ordner nach ihrer Konfiguration. Zudem lassen sich umgebungsspezifische Konfigurationen ablegen, wie z.B. dev.exs, test.exs.
├── lib │ └── foo
Teile der Konfiguration finden sich außerdem im lib-Ordner, diese werden einmalig kompiliert und in die BEAM geladen, wärend die im config-Ordner abgelegten Skripte bei jeder Änderung neu kompiliert werden. Sich selten ändernde Konfigurationen sollten daher aus Performancegründen im lib-Ordner gespeichert werden.
├── priv
Der Ordner priv ist eine OTP-Anforderung (Open Telecom Platform) aus der frühen Erlangzeit, er wird heute
für statisch generierten Webcontent und für das Seeding benutzt.
└── web
Das Phoenix-Framework implementiert das bekannte Model-View-Controller-Architekturmuster (MVC). Im web-Unterverzeichnis liegen MVC-Artefakte wie controller, models und views. Anders als bei anderen MVC-Frameworks, wie zum Beipiel Ruby on Rails, unterscheidet Phoenix zwischen templates und views. Die Templates werden aus Performancegründen vorkompiliert. Außerdem wird im Webverzeichnis statischer Inhalt (JavaScript, CSS) abgelegt. Die Datei router.ex enthält Routing-Informationen, hier werden Requestpfade auf Controllermethoden abgebildet.
“Bird watch”
Ein leeres Projekt zeigt schon einmal die grundlegende Funktionalität von Phoenix. (s. Bilder) Darüber hinaus werden anhand einer konkreten Real-World-Demoapplikation weitere Eigenschaften gezeigt. Unter dem Github Link steht aus diesem Grund die Anwendung bird_watch bereit, die einige Basisfunktionen von Phoenix nutzt.
Projekt auschecken:
git clone https://github.com/mkrogemann/bird_watch
cd bird_watch
mix deps.get
Mit mix deps.get werden die Dependencies installiert. Mix ist ein build tool, mit dem es u.a. möglich ist, Elixirprojekte zu erstellen, zu kompilieren, zu testen und Dependencies zu installieren.
Als nächstes wird das Datenbankseeding ausgeführt:
mix run priv/repo/seeds.exs
Nun können wir die Applikation starten und im Browser öffnen:
mix phoenix.server
http://localhost:4000
Fazit/Résumé
Wir haben in wenigen Schritten eine funktionale Webanwendung erstellt und gezeigt, wie man mit wenig Aufwand Änderungen hinzufügt, die dank des live-reloadings sofort zur Verfügung standen, dies erhöht die Produktivität beim täglichen Arbeiten mit Phoenix. Ein weiterer Vorteil liegt in der Performanz des Systems, von der man sich auch in Benchmarks überzeugen kann. In weiteren Blogposts werden wir die hier vorgestellte Applikation „Bird watch“ weiterentwickeln und dabei die Funktionalitäten und Vorzüge von Phoenix und Elixir detaillierter betrachten.
Dein Job bei codecentric?
Jobs
Agile Developer und Consultant (w/d/m)
Alle Standorte
Weitere Artikel in diesem Themenbereich
Entdecke spannende weiterführende Themen und lass dich von der codecentric Welt inspirieren.
Gemeinsam bessere Projekte umsetzen.
Wir helfen deinem Unternehmen.
Du stehst vor einer großen IT-Herausforderung? Wir sorgen für eine maßgeschneiderte Unterstützung. Informiere dich jetzt.
Hilf uns, noch besser zu werden.
Wir sind immer auf der Suche nach neuen Talenten. Auch für dich ist die passende Stelle dabei.
Blog-Autor*in
Marcel Wolf
Du hast noch Fragen zu diesem Thema? Dann sprich mich einfach an.
Du hast noch Fragen zu diesem Thema? Dann sprich mich einfach an.