Heinrich Schiller  29.09.2020 12:42

Einblicke in Slim PHP

Anfang des Jahres 2020 habe ich einen kurzen Ausblick geschrieben, Jahresausblick 2020 und was ich in diesem Jahr so alles erreichen möchte. Unter anderem ging es um die Weiterentwicklung meines selbst geschriebenen CMS-System, welches mit Verlaub ... ja, nun ... etwas bescheiden ist. Der jetzige Zustand ist eigentlich nur als katastrophal zu bezeichnen, die Software habe ich seit 2018 nicht mehr gepflegt, glaube aber 2019 noch einen (vielleicht zwei) Bug(s) beseitigt. Zu wenig von sehr vielen Bugs die hier existieren. Das Problem war weniger der Verlust von Interesse, mehr Zeitmangel. Ist leider so :-/

Nichts desto trotz habe ich mir in dem Artikel irgendeine Form von Weiterentwicklung gewünscht und bin da tatsächlich jetzt auch am Ausarbeiten. Also zunächst plan technischer Natur, nebenbei schaue ich mir die ein oder andere Technologie an, womit ich vielleicht demnächst arbeiten möchte. Und jetzt möchte ich eins davon hier natürlich vorstellen.

Slim

Auf Slim bin ich durch das PHP-Magazin 4.20 und dem Artikel, Micro ist das neue Maxi gestoßen. Es ist ein PHP micro Framework, das sich viel auf PHP-Techniken stützt und PHP-Standards von php-fig nutzt. Zitat aus der Slim-Dokumentation:

"Slim is a PHP micro framework that helps you quickly write simple yet powerful web applications and APIs. At its core, Slim is a dispatcher that receives an HTTP request, invokes an appropriate callback routine, and returns an HTTP response. That’s it." 

Es hat also seine Kernaufgaben und was der Entwickler sonst so braucht, kann er es demnach selbst integrieren. Die Vorteile liegen für mich auf der Hand. Man muss nicht komplettes Framework nutzen und lernen. Man muss nicht komplettes Framework austauschen, falls es man eingestampft wird, siehe Zend Framework das jetzt Laminas oder so ähnlich heißt. Und man muss nicht komplettes Framework migrieren, das irgendwann zu veralten droht. Slim ist ziemlich klein, aber so ausgelegt das man es stark erweitern kann. Slim soll aber kein Ersatz für Frameworks, wie Laravel oder Symfony sein. Viel mehr ein Werkzeug, wo Laravel oder Symfony als zu groß erscheinen. Wichtig dazu noch, Laravel und Symfony pflegen neben den großen Framework auch eigene micro Frameworks, Lumen(Laravel) und Silex(Symfony).

Hallo Welt App

Jetzt geht es ins eingemachte... eine simple App die darstellt wie Slim funktioniert. Gut dafür kann man auch die Dokumentation nutzen. Ich glaube aber das mein Tutorial kürzer ist :-) Es ist aber unumgänglich auch die Dokumentation von Slim zu lesen... versteht sich von selbst.

Wichtig ist, das Composer auf dem eigenen System installiert ist, man sich in einem Projektordner befindet wo Slim landen soll, php aus dem Terminal aufrufbar ist und gegeben falls noch der Webserver weiß, zb. XAMPP, wie er den Projektordner aufrufen soll. Ist das alles gegeben, holt man sich über Composer, Slim in den Projektordner.

composer require slim/slim:"4.*" slim/psr7

Bei slim/slim handelt es sich um das Framework an sich. Es bringt noch weitere Bibliotheken(Libs) mit, zum Beispiel für Routing. Bei slim/psr7 handelt es sich im eine Implementierung des PHP-FIG-PSR7-Strandards und ist ein Abhängigkeit für Slim, ohne das es nicht funktioniert. Laut der Dokumentation kann man zwischen verschiedenen Implementierungen wählen.

Nun geht es um den Code selbst. Ist alles erfolgreich verlaufen, legt Composer einen vendor-Ordner an, wo Slim und alle Abhängigkeiten liegen und eine autoload.php-Datei. Wir erstellen eine index.php, mit dem folgenden Inhalt.

<?php

use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Message\ResponseInterface as Response;
use Slim\Factory\AppFactory;

require __DIR__ . '/vendor/autoload.php';

$app = AppFactory::create();

$app->get('/', function(Request $request, Response $response) {
    $response->getBody()->write('Hello World!');
    
    return $response;
});

$app->run();

Im groben, was passiert hier? Mit require ...autoload.php, holen wir uns den Composer-Autoloader. Der lädt automatisch alle im Projekt befindlichen Klassen automatisch und erspart uns weitere require aufrufe von irgendwelchen Klassen. Danach erstellen wir die eigentliche Slim-App und zum Schluss lassen wir es mit der Methode run laufen. Dazwischen befindet sich eine Route mit einer Antwort vom HTTP. Wir schreiben eine Nachricht an den HTTP-Body und geben diese anschließen aus. Slim erwartet immer Ausgabe vom Typ Response. Nun müssen wir die Seite nur noch aufrufen.

Das wars! So funktioniert im groben Slim. Nun ist das eine ziemlich kleine App, ohne Controller, Modell usw. aber darum ging es in diesem Beitrag nicht. Aber natürlich ist das möglich. Vielleicht schreibe ich auch darüber.