{"id":1073,"date":"2022-01-09T14:36:56","date_gmt":"2022-01-09T13:36:56","guid":{"rendered":"https:\/\/informatik.htwk-leipzig.de\/seminar\/?p=1073"},"modified":"2022-01-11T11:23:54","modified_gmt":"2022-01-11T10:23:54","slug":"lumen","status":"publish","type":"post","link":"https:\/\/informatik.htwk-leipzig.de\/seminar\/lehrveranstaltungen\/betriebliche-informationssysteme\/2022\/lumen\/","title":{"rendered":"Lumen Mikro Framework"},"content":{"rendered":"<h1>Lumen &#8211; das schnelle Mikro-Framework von Laravel<\/h1>\n<h2>Inhalt:<\/h2>\n<ul>\n<li>\n<h4>Was ist Lumen<\/h4>\n<\/li>\n<li>\n<h4>Wo kann das Lumen-Framework angewendet werden<\/h4>\n<\/li>\n<li>\n<h4>Komponenten in Lumen<\/h4>\n<\/li>\n<li>\n<h4>Installation<\/h4>\n<\/li>\n<li>\n<h4>Anwendung: eine Nutzerverwaltung mit Token-Verifizierung<\/h4>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<figure id=\"attachment_1088\" aria-describedby=\"caption-attachment-1088\" style=\"width: 660px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/github.com\/Barathaner\/Lumen-nutzerverwaltung-authentication-example\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-1088\" src=\"https:\/\/informatik.htwk-leipzig.de\/seminar\/wp-content\/uploads\/2022\/01\/lumenCode.jpg\" alt=\"lumenCode\" width=\"660\" height=\"282\" \/><\/a><figcaption id=\"caption-attachment-1088\" class=\"wp-caption-text\">Auszug Lumen PHP Quellcode<\/figcaption><\/figure>\n<hr \/>\n<h2>Was ist Lumen<\/h2>\n<p>Lumen ist ein Projekt des Laravel-Erfinders Taylor Otwell. Es ist ein &#8222;Mikro-Framework&#8220;, das hei\u00dft, es ist eine kleinere, schnellere und schlankere Version eines vollst\u00e4ndigen Webanwendungs-Frameworks <a href=\"https:\/\/laravel.com\/\">(Laravel).<\/a><\/p>\n<p>Lumen hat die gleiche Codebasis wie Laravel und viele gleiche Komponenten. Aber Lumen ist f\u00fcr Microservices gebaut, nicht so sehr f\u00fcr benutzerorientierte Anwendungen.<\/p>\n<h2>Wo kann das Lumen-Framework angewendet werden<\/h2>\n<p>Lumen ist f\u00fcr Projekte gedacht, die von der Eleganz und Leistungsf\u00e4higkeit von Laravel profitieren sollen. Einfach zu lesender und wartbarer Code, vollst\u00e4ndig integriertes Unit-Testing. Man opfert gegen\u00fcber Laravel etwas Konfigurierbarkeit und Flexibilit\u00e4t f\u00fcr einen erheblichen Geschwindigkeitsschub.<\/p>\n<figure id=\"attachment_1092\" aria-describedby=\"caption-attachment-1092\" style=\"width: 267px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/lumen.laravel.com\/#speed-block\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-1092\" src=\"https:\/\/informatik.htwk-leipzig.de\/seminar\/wp-content\/uploads\/2022\/01\/speedCompare.jpg\" alt=\"Geschwindigkeits Vergleich PHP Frameworks\" width=\"267\" height=\"228\" \/><\/a><figcaption id=\"caption-attachment-1092\" class=\"wp-caption-text\">Geschwindigkeits Vergleich PHP Frameworks<\/figcaption><\/figure>\n<p>Lumen ist auf Microservices ausgerichtet &#8211; kleine, lose gekoppelte Komponenten, die in der Regel ein Kernprojekt unterst\u00fctzen und erweitern. Microservices sind getrennte Komponenten mit begrenzten Kontexten (d.h. sie haben wohldefinierte Schnittstellen untereinander). In einer Microservice-Architektur k\u00f6nnten Sie also mehrere kleine Lumen-Anwendungen haben, die eine andere, m\u00f6glicherweise von Laravel betriebene, Anwendung unterst\u00fctzen.<\/p>\n<h2>Komponenten in Lumen<\/h2>\n<h3>Routing<\/h3>\n<p>Routing, das hei\u00dft Pfad-Planung, wird in Lumen standardm\u00e4\u00dfig unterst\u00fctzt. Dazu geh\u00f6ren grundlegendes Routing, Routing-Parameter, benannte Routen und Routengruppen wie Middleware. (z.B. GET POST PUT usw.)<\/p>\n<h3>Authentifizierung<\/h3>\n<p>Die Authentifizierung unterst\u00fctzt keinen Sitzungsstatus. Das hei\u00dft, APIs nutzen keine Sitzungs-Cookies und sind immer Zustandslos. Eingehende Anfragen werden \u00fcber zustandslose Mechanismen wie Tokens authentifiziert.<\/p>\n<h3>Caching<\/h3>\n<p>Das Caching ist genauso implementiert wie in Laravel. Cache-Treiber wie Database, Memcached und Redis werden unterst\u00fctzt.<\/p>\n<h3>Fehler und Logging<\/h3>\n<p>Fehler und Logging werden \u00fcber die Monolog-Bibliothek implementiert, die Unterst\u00fctzung f\u00fcr verschiedene Log-Handler bietet. Damit k\u00f6nnen Logs z.B. in den syslog geschrieben werden. Aber auch komplexeres logging wie Elastic-Search oder Redis sind m\u00f6glich.<\/p>\n<h3>Queuing<\/h3>\n<p>Die Queuing (Warteschlangendienste) \u00e4hneln denen, die Laravel bietet. Es wird eine einheitliche API f\u00fcr eine Vielzahl von verschiedenen Warteschlangen-Backends bereitgestellt. Zum Beispiel k\u00f6nnen rechenintensive Zugriffe oder Updates im Hintergrund in einer Queue ausgef\u00fchrt werden. W\u00e4hrend die Lumen API schon eine Response gesendet hat.<\/p>\n<h3>Events<\/h3>\n<p>Ereignisse bieten eine einfache Beobachterimplementierung (Observer), mit der Ereignisse in der Lumen-Anwendung abonniert und abgeh\u00f6rt werden k\u00f6nnen.<\/p>\n<h3>Encryption<\/h3>\n<p>Um sensible Daten wie Passw\u00f6rter oder Zahlungsdaten zu speichern, nutzt Lumen die OpenSSL (AES-256-CBC) Verschl\u00fcsselung. Dazu werden die Befehle\u00a0<em>Crypt::encrypt(secret) <\/em>und <em>Crypt::decrypt($encryptedValue) <\/em>zur Verf\u00fcgung gestellt.<\/p>\n<h2>Installation<\/h2>\n<p>Composer, ein Abh\u00e4ngigkeitsmanager f\u00fcr PHP ist die Grundlage f\u00fcr die Installation und Verwaltung von Lumen. Daher muss Composer auf dem Rechner installiert sein, bevor man Lumen installieren kann.<\/p>\n<p>Composer l\u00e4uft nur mit PHP. Installationsanleitungen finden sich dazu unter der <a href=\"https:\/\/www.php.net\/manual\/de\/install.php\">PHP-Website.<\/a><\/p>\n<p>Folgende Befehle sind n\u00f6tig um ein Lumen Projekt mit dem Namen blog aufzusetzten und dann auf dem localhost, Port 8000 zu starten:<\/p>\n<pre>composer create-project \u2013prefer-dist laravel\/lumen blog\r\nphp -S localhost:8000 -t public\r\n<\/pre>\n<h2>Anwendung: eine Nutzerverwaltung mit Token-Verifizierung<\/h2>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-1192\" src=\"https:\/\/informatik.htwk-leipzig.de\/seminar\/wp-content\/uploads\/2022\/01\/NutzerVerwaltung.png\" alt=\"Nutzerverwaltung Beispiel Frontend in HTML\" width=\"570\" height=\"255\" \/><\/p>\n<p>Nutzerverwaltung Beispiel Frontend in HTML<\/p>\n<h3>Lumen konfigurieren<\/h3>\n<p>Nachdem das Lumen-Projekt aufgesetzt wurde, sollte ein App-Key erzeugt werden. Dieser sollte aus 32 zuf\u00e4lligen Zahlen und Buchstaben bestehen und in der\u00a0<em>.env\u00a0<\/em>Datei under APP_KEY eingetragen werden.<\/p>\n<p>&nbsp;<\/p>\n<h3>Datenbank vorbereiten<\/h3>\n<p>Lumen unterst\u00fctzt die Verwendung einer Vielzahl von Datenbanken. Der Einfachheit halber soll hier nur die SQLite DB (File-Databasee) verwendeet werden. Dazu wird in der\u00a0<em>.env\u00a0<\/em>Datei die\u00a0<em>DB_CONNECTION=sqlite und DB_DATABASE=&lt;path&gt; <\/em>gesetzt f\u00fcr Path wird der absolute Pfad zu eine leeren <em>.sqlite &#8211; <\/em>Datei eingesetzt.<\/p>\n<p>Um Nutzer verwalten zu k\u00f6nnen, m\u00fcssen Diese in einer Datenbank abgelegt werden. Um die entsprechende Tabelle zu erzeugen gibt es in Lumen vorgefertigte Werkzeuge. Die Datenbank-Migration der <em>User-Table\u00a0<\/em>wird mit folgendem Befehl von Lumen generiert:<\/p>\n<pre>php artisan make:migration User\r\n<\/pre>\n<p>Im ordner\u00a0<em>database\/migrations\u00a0<\/em> wird die neue Migration erzeugt. Diese wird entsprechend erweitert mit den notwendigen Felder:<\/p>\n<pre>class User extends Migration\r\n{\r\n    \/\r\n     * Run the migrations.\r\n     *\r\n     * @return void\r\n     *\/\r\n    public function up()\r\n    {\r\n        Schema::create('users', function (Blueprint $table) {\r\n            $table-&gt;id();\r\n            $table-&gt;string('fname');\r\n            $table-&gt;string('sname');\r\n            $table-&gt;timestamps();\r\n        });\r\n    }\r\n\r\n    \/\r\n     * Reverse the migrations.\r\n     *\r\n     * @return void\r\n     *\/\r\n    public function down()\r\n    {\r\n        Schema::drop('users');\r\n    }\r\n}\r\n<\/pre>\n<h3>Routes erstellen<\/h3>\n<p>In der Datei <em>routes\/web.php\u00a0<\/em>werden von der API akzeptierte Pfade implementiert. Um alle Eintr\u00e4ge aus der\u00a0<em>User\u00a0<\/em>Tabelle zu erhalten kann z.B. folgender Code genutzt werden:<\/p>\n<pre>$router-&gt;get('\/users', function () use ($router) {\r\n    return response()-&gt;json(app('db')-&gt;select(\"SELECT * FROM users\"));\r\n});\r\n<\/pre>\n<p>Diese Route ist dann unter\u00a0<em>http:\/\/localhost:8000\/users\u00a0<\/em>erreichbar.<\/p>\n<p>Um einen neuen Nutzer anzulegen wird ein POST Request genutzt. Dieses verbindet das Eingabeformular mit der Datenbank. Hier soll, der Einfachheit halber, ein simples HTML-Formular verwendet werden. Denkbar w\u00e4re aber auch ein POST-Request mit den entsprechenden einzutragenden Nutzerdaten \u00fcber ein beliebiges anderes Frontend (Windows-EXE Datei, React-Web-App oder Android APK)<\/p>\n<p><a href=\"https:\/\/raw.githubusercontent.com\/Barathaner\/Lumen-nutzerverwaltung-authentication-example\/main\/htmlpage\/index.html\">Link zur HTML-Datei<\/a><\/p>\n<h3>Authentisierung<\/h3>\n<p>Im <em>POST<\/em> Request steht ein API-TOKEN. Dieses wird durch die Lumen &#8211; Auth-Middleware \u00fcberpr\u00fcft und mit dem in der <em>.env-Datei<\/em> hinterlegten Token verglichen.<\/p>\n<p>Dazu werden im Lumen Projekt in der Datei <em>bootstrap\/app.php\u00a0<\/em>die folgenden Zeilen einkommentiert:<\/p>\n<pre>$app-&gt;routeMiddleware([\r\n    'auth' =&gt; App\\Http\\Middleware\\Authenticate::class,\r\n]);\r\n\r\n$app-&gt;register(App\\Providers\\AuthServiceProvider::class);\r\n<\/pre>\n<p>Danach wird definiert, wie man den Nutzer Authentifizieren m\u00f6chte. Die passiert in der Datei:\u00a0<em>app\/providers\/AuthServiceProvider.php<\/em><\/p>\n<pre>.\r\n.\r\n.\r\n    public function boot()\r\n    {\r\n        \/\/ Here you may define how you wish users to be authenticated for your Lumen\r\n        \/\/ application. The callback which receives the incoming request instance\r\n        \/\/ should return either a User instance or null. You're free to obtain\r\n        \/\/ the User instance via an API token or any other method necessary.\r\n\r\n        $this-&gt;app['auth']-&gt;viaRequest('api', function ($request) {\r\n            if ($request-&gt;input('api_token')) {\r\n                if($request-&gt;input('api_token') === env(\"APP_TOKEN\")){\r\n                    return new User();\r\n                }\r\n                \/\/return User::where('api_token', $request-&gt;input('api_token'))-&gt;first();\r\n            }\r\n        });\r\n    }\r\n}\r\n.\r\n.\r\n.\r\n<\/pre>\n<p>Das Token wird aus dem\u00a0<em>.env-File\u00a0<\/em>geladen, um bei der Ver\u00f6ffentlichung des Quellcodes geheim zu bleiben. <em>ENV-Files\u00a0<\/em>werden durch die .gitignore nicht mit hochgeladen.<\/p>\n<p>Um Datenbank-\u00c4nderungen (User-POST) nur durch Authentifizierte Nutzer zuzulassen, wird eine neue Pfad-Verbindung in <em>routes\/web.php<\/em> erstellt. Diese wird mittels der Auth-Middleware gesch\u00fctzt:<\/p>\n<pre>$router-&gt;post('\/test', ['middleware' =&gt; 'auth', function (Illuminate\\Http\\Request $request) {\r\n    $fname = $request-&gt;input('fname');\r\n    $sname = $request-&gt;input('sname');\r\n    $pdo = DB::connection()-&gt;getPdo();\r\n\r\n$result = DB::insert(sprintf(\"INSERT INTO users (fname,sname)\r\nVALUES ('%s','%s')\",$fname,$sname));\r\n    return  response()-&gt;json([\"result\" =&gt; \"ok\",\r\n\"user\"=&gt; [\r\n    \"id\" =&gt; $pdo-&gt;lastInsertId(),\r\n    \"fname\" =&gt; $fname,\r\n    \"sname\" =&gt; $sname\r\n]]);\r\n}]);\r\n<\/pre>\n<h2>Weiterf\u00fchrende Gedanken<\/h2>\n<h4>Beispiel Nutzerverwaltung als Git Repository<\/h4>\n<p>Der Quellcode f\u00fcr das Beispiel der Nutzerverwaltung liegt <a href=\"https:\/\/github.com\/Barathaner\/Lumen-nutzerverwaltung-authentication-example\">HIER.<\/a><\/p>\n<h4>Vorteile<\/h4>\n<p>Die Tatsache, dass Lumen Laravel untergliedert ist, kann es leicht auf das Laravel angehoben werden.<br \/>\nLumen hat eine geringe Lernkurve und ist einfach zu bedienen. Lumen gilt als eines der schnellsten Mikro-Frameworks von PHP und ist in der Lage hoch-performante Web-Applikationen mit Daten zu versorgen.<\/p>\n<h4>Nachteile<\/h4>\n<p>Lumen ist haupts\u00e4chlich f\u00fcr kleinere Anwendungen gedacht. Teilweise m\u00fcssen simple Anfragen sehr abstrakt programmiert werden, da das Framework f\u00fcr fast alle Arten von Aufgaben und Anfragen schon ein Werkzeug mitliefert. Der Nachteil ist hier weniger Flexibilit\u00e4t.<\/p>\n<h2>Links zum Thema &#8211; Quellen<\/h2>\n<ul>\n<li><a href=\"https:\/\/lumen.laravel.com\/\">Lumen-Homepage<\/a><\/li>\n<li><a href=\"https:\/\/lumen.laravel.com\/docs\/\">Lumen Dokumentation<\/a><\/li>\n<li><a href=\"https:\/\/auth0.com\/blog\/developing-restful-apis-with-lumen\/\">RESTful API Tutorial<\/a><\/li>\n<li><a href=\"https:\/\/www.bacancytechnology.com\/blog\/laravel-vs-lumen\">Laravel vs Lumen<\/a><\/li>\n<\/ul>\n<h3><\/h3>\n","protected":false},"excerpt":{"rendered":"<p>Lumen &#8211; das schnelle Mikro-Framework von Laravel Inhalt: Was ist Lumen Wo kann das Lumen-Framework angewendet werden Komponenten in Lumen<\/p>\n","protected":false},"author":63,"featured_media":1075,"comment_status":"open","ping_status":"open","sticky":false,"template":"templates\/template-fullwidth.php","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[70,72,68,67,69,71],"class_list":["post-1073","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-betriebliche-informationssysteme","tag-api","tag-authorization","tag-laravel","tag-lumen","tag-php","tag-rest"],"_links":{"self":[{"href":"https:\/\/informatik.htwk-leipzig.de\/seminar\/wp-json\/wp\/v2\/posts\/1073","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/informatik.htwk-leipzig.de\/seminar\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/informatik.htwk-leipzig.de\/seminar\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/informatik.htwk-leipzig.de\/seminar\/wp-json\/wp\/v2\/users\/63"}],"replies":[{"embeddable":true,"href":"https:\/\/informatik.htwk-leipzig.de\/seminar\/wp-json\/wp\/v2\/comments?post=1073"}],"version-history":[{"count":27,"href":"https:\/\/informatik.htwk-leipzig.de\/seminar\/wp-json\/wp\/v2\/posts\/1073\/revisions"}],"predecessor-version":[{"id":1195,"href":"https:\/\/informatik.htwk-leipzig.de\/seminar\/wp-json\/wp\/v2\/posts\/1073\/revisions\/1195"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/informatik.htwk-leipzig.de\/seminar\/wp-json\/wp\/v2\/media\/1075"}],"wp:attachment":[{"href":"https:\/\/informatik.htwk-leipzig.de\/seminar\/wp-json\/wp\/v2\/media?parent=1073"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/informatik.htwk-leipzig.de\/seminar\/wp-json\/wp\/v2\/categories?post=1073"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/informatik.htwk-leipzig.de\/seminar\/wp-json\/wp\/v2\/tags?post=1073"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}