Am 25. April 2019 erblickte die neue alpha
Hauptversion des Slim- Mikroframeworks das Licht der Welt und am 18. Mai wurde sie zur beta
Version. Ich schlage vor, dass Sie sich mit der neuen Version vertraut machen.
Unter dem Schnitt:
- Über die Neuerungen des Frameworks
- Schreiben einer einfachen Anwendung auf Slim-4
- Über Slim und PhpStorm Friendship
Neu in Slim 4
Wichtige Neuerungen im Vergleich zu Version 3:
- Die Mindestversion von PHP ist 7.1;
- Unterstützung für PSR-15 (Middleware);
- Die Implementierung von http-Nachrichten wurde entfernt. Installieren Sie eine PSR-7-kompatible Bibliothek und verwenden Sie sie.
- Pickelabhängigkeit entfernt. Installieren Sie Ihren bevorzugten PSR-11-kompatiblen Container und verwenden Sie ihn.
- Die Möglichkeit, Ihren Router zu verwenden (Bisher war es nicht möglich, FastRoute aufzugeben).
- Die Implementierung der Fehlerbehandlung wurde geändert.
- Geänderte Implementierung der Antwortausgabe;
- Factory hinzugefügt, um eine Instanz der Anwendung zu erstellen;
- Einstellungen entfernt;
- Slim setzt
default_mimetype
nicht mehr auf eine leere Zeichenfolge, daher müssen Sie diese selbst in der php.ini
oder in Ihrer Anwendung mit ini_set('default_mimetype', '')
installieren. - Der Anwendungsanforderungshandler akzeptiert jetzt nur das Anforderungsobjekt (in der alten Version hat er Anforderungs- und Antwortobjekte akzeptiert).
Wie erstelle ich jetzt eine Anwendung?
In der dritten Version sah das Erstellen der Anwendung ungefähr so aus:
<?php use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Message\ResponseInterface; use Slim\App; require 'vendor/autoload.php'; $settings = [ 'addContentLengthHeader' => false, ]; $app = new App(['settings' => $settings]); $app->get('/hello/{name}', function (ServerRequestInterface $request, ResponseInterface $response, array $args) { $name = $args['name']; $response->getBody()->write("Hello, $name"); return $response; }); $app->run();
Jetzt akzeptiert der Anwendungskonstruktor die folgenden Parameter:
Sie können jetzt auch die statische create
der Application Factory \Slim\Factory\AppFactory
.
Diese Methode akzeptiert dieselben Parameter wie die Eingabe, nur alle sind optional.
<?php use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Message\ResponseInterface; use Slim\Factory\AppFactory; require 'vendor/autoload.php'; $app = AppFactory::create(); $app->get('/hello/{name}', function (ServerRequestInterface $request, ResponseInterface $response) { $name = $request->getAttribute('name'); $response->getBody()->write("Hello, $name"); return $response; }); $app->run();
Gib mir 404 Fehler zurück!
Wenn wir versuchen, eine nicht vorhandene Seite zu öffnen, erhalten wir einen Antwortcode von 500
und nicht von 404
. Damit Fehler korrekt verarbeitet werden, müssen Sie \Slim\Middleware\ErrorMiddleware
<?php use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Message\ResponseInterface; use Slim\Factory\AppFactory; use Slim\Middleware\ErrorMiddleware; require 'vendor/autoload.php'; $app = AppFactory::create(); $middleware = new ErrorMiddleware( $app->getCallableResolver(), $app->getResponseFactory(), false, false, false ); $app->add($middleware); $app->get('/hello/{name}', function (ServerRequestInterface $request, ResponseInterface $response) { $name = $request->getAttribute('name'); $response->getBody()->write("Hello, $name"); return $response; }); $app->run();
Middleware
Middleware sollte jetzt eine PSR-15-Implementierung sein. Ausnahmsweise können Sie Funktionen übergeben, die Signatur muss jedoch mit der process()
-Methode der Schnittstelle \Psr\Http\Server\MiddlewareInterface
<?php use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Message\ResponseInterface; use Psr\Http\Server\RequestHandlerInterface; use Slim\Factory\AppFactory; require 'vendor/autoload.php'; $app = AppFactory::create(); $app->add(function (ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface { $response = $handler->handle($request); return $response->withHeader('Content-Type', 'application/json'); });
Die Signatur ($request, $response, $next)
nicht mehr unterstützt
Wie lebe ich ohne Einstellungen?
Sie können ohne Einstellungen leben. Die bereitgestellten Tools helfen uns dabei.
httpVersion
und responseChunkSize
Die httpVersion
war für die Ausgabe der Protokollversion in der Antwort verantwortlich.
Die Einstellung responseChunkSize
bestimmte die Größe jedes Chunks, der aus dem Antworttext gelesen wurde, wenn er an den Browser gesendet wurde.
Diese Funktionen können nun dem Sender der Antwort zugewiesen werden.
Emitter schreiben
<?php
Wir verbinden uns mit der Anwendung
<?php use App\ResponseEmitter; use Slim\Factory\AppFactory; require 'vendor/autoload.php'; $app = AppFactory::create(); $serverRequestFactory = \Slim\Factory\ServerRequestCreatorFactory::create(); $request = $serverRequestFactory->createServerRequestFromGlobals();
outputBuffering
Diese Einstellung ermöglichte das Ein- und Ausschalten der Ausgangspufferung. Werte einstellen:
false
- Die Pufferung ist deaktiviert (alle Aufrufe von echo
, print
werden ignoriert).'append'
- Alle Aufrufe von echo
und print
werden nach dem Antworttext hinzugefügt'prepend'
- Alle Aufrufe von echo
und print
werden vor dem Antworttext hinzugefügt
\Slim\Middleware\OutputBufferingMiddleware
Entwickler schlagen vor, diese Option durch \Slim\Middleware\OutputBufferingMiddleware
zu \Slim\Middleware\OutputBufferingMiddleware
, in deren Konstruktor eine PSR-17-kompatible Stream-Factory und ein Modus übergeben werden, der dem append
oder prepend
gleich sein kann
<?php use Slim\Factory\AppFactory; use Slim\Factory\Psr17\SlimPsr17Factory; use Slim\Middleware\OutputBufferingMiddleware; require 'vendor/autoload.php'; $app = AppFactory::create(); $middleware = new OutputBufferingMiddleware(SlimPsr17Factory::getStreamFactory(), OutputBufferingMiddleware::APPEND); $app->add($middleware);
determineRouteBeforeAppMiddleware
Diese Einstellung ermöglichte es, die aktuelle Route vom Anforderungsobjekt in der Middleware abzurufen
Ein Ersatz wird bereitgestellt \Slim\Middleware\RoutingMiddleware
<?php use Slim\Factory\AppFactory; use Slim\Middleware\RoutingMiddleware; require 'vendor/autoload.php'; $app = AppFactory::create(); $middleware = new RoutingMiddleware($app->getRouteResolver()); $app->add($middleware);
displayErrorDetails
Die Einstellung erlaubt die Anzeige von Fehlerdetails. Beim Debuggen erleichtert es das Leben.
\Slim\Middleware\ErrorMiddleware
du dich an \Slim\Middleware\ErrorMiddleware
? Hier wird es uns helfen!
<?php use Slim\Factory\AppFactory; use Slim\Middleware\ErrorMiddleware; require 'vendor/autoload.php'; $app = AppFactory::create(); $middleware = new ErrorMiddleware( $app->getCallableResolver(), $app->getResponseFactory(), true,
addContentLengthHeader
Mit dieser Einstellung konnte das automatische Hinzufügen des Content-Length
Headers mit dem Wert des Datenvolumens im Antworttext aktiviert / deaktiviert werden
Ersetzt die Middleware-Option \Slim\Middleware\ContentLengthMiddleware
<?php use Slim\Factory\AppFactory; use Slim\Middleware\ContentLengthMiddleware; require 'vendor/autoload.php'; $app = AppFactory::create(); $middleware = new ContentLengthMiddleware(); $app->add($middleware);
routerCacheFile
Jetzt können Sie die Router-Cache-Datei direkt installieren
<?php use Slim\Factory\AppFactory; require 'vendor/autoload.php'; $app = AppFactory::create(); $app->getRouteCollector()->setCacheFile('/path/to/cache/router.php');
Erstellen einer Anwendung auf Slim-4
Um das Framework genauer zu betrachten, werden wir eine kleine Anwendung schreiben.
Die Anwendung hat die folgenden Routen:
/hello/{name}
- Begrüßungsseite;/
- Weiterleiten auf die Seite /hello/world
- Andere Routen geben eine benutzerdefinierte Seite mit 404-Fehlern zurück.
Die Logik wird in den Controllern sein, wir werden die Seite durch die Twig Template Engine rendern
Fügen Sie als Bonus eine Konsolenanwendung hinzu, die auf der Symfony Console- Komponente basiert, mit einem Befehl, der eine Liste von Routen anzeigt
Schritt 0. Abhängigkeiten installieren
Wir werden brauchen:
Ich habe Ultra-Lite / Container als Abhängigkeitscontainer ausgewählt, als leicht, präzise und konform mit dem Standard.
PSR-7 und PSR-17 Slim-Entwickler bieten slim / psr7 in einem Paket. Wir werden es benutzen
Es wird davon ausgegangen, dass der Composer- Paketmanager bereits installiert ist.
Wir erstellen einen Ordner für das Projekt ( /path/to/project
wird als Beispiel verwendet) und gehen dorthin.
Fügen Sie die Datei composer.json
mit dem folgenden Inhalt zum Projekt hinzu:
{ "require": { "php": ">=7.1", "slim/slim": "4.0.0-beta", "slim/psr7": "~0.3", "ultra-lite/container": "^6.2", "symfony/console": "^4.2", "twig/twig": "^2.10" }, "autoload": { "psr-4": { "App\\": "app" } } }
und führen Sie den Befehl aus
composer install
Jetzt haben wir alle notwendigen Pakete und der Klassen-Autoloader ist konfiguriert.
Wenn wir mit git arbeiten , fügen Sie die .gitignore
Datei hinzu und fügen Sie dort das vendor
(und ggf. das Verzeichnis Ihrer IDE).
/.idea/* /vendor/*
Ich verwende die PhpStorm- IDE und stolz darauf . Für eine komfortable Entwicklung ist es Zeit, sich mit dem Container und der IDE anzufreunden.
Erstellen .phpstorm.meta.php
im Stammverzeichnis des Projekts die Datei .phpstorm.meta.php
und schreiben Sie dort den folgenden Code:
<?php
Dieser Code teilt der IDE mit, dass die Methode get()
für ein Objekt, das die Schnittstelle \Psr\Container\ContainerInterface
implementiert, ein Klassenobjekt oder eine Schnittstellenimplementierung \Psr\Container\ContainerInterface
, deren Name im Parameter übergeben wird.
Schritt 1. Anwendungsframework
Fügen Sie die Verzeichnisse hinzu:
app
- Anwendungscode. Wir werden unseren Namespace für den Klassen-Autoloader damit verbinden.bin
- Verzeichnis für das Konsolendienstprogramm;config
- hier sind die Anwendungskonfigurationsdateien;public
- ein im Web geöffnetes Verzeichnis (Anwendungseinstiegspunkt, Stile, js, Bilder usw.);template
- template
;var
ist das Verzeichnis für verschiedene Dateien. Protokolle, Cache, lokaler Speicher usw.
Und die Dateien:
config/app.ini
- die Hauptanwendungskonfiguration;config/app.local.ini
- Konfiguration für local
Umgebung;app/Support/CommandMap.php
- Zuordnung von Konsolenanwendungsbefehlen zum verzögerten Laden.app/Support/Config.php
- Konfigurationsklasse (damit die IDE weiß, welche Konfigurationen wir haben).app/Support/NotFoundHandler.php
- 404 Fehlerbehandlungsklasse.app/Support/ServiceProviderInterface.php
- Die Schnittstelle des Dienstanbieters.app/Provider/AppProvider.php
- Der Hauptanbieter der Anwendung.bootstrap.php
- Container-Assembly;bin/console
- Einstiegspunkt der Konsolenanwendung;public/index.php
- Einstiegspunkt der Webanwendung.
config / app.ini ; slim.debug=Off ; templates.dir=template ; templates.cache=var/cache/template
config / app.local.ini ; . ; slim.debug=On ; templates.cache=
Oh ja, es ist immer noch schön, Umgebungskonfigurationen aus dem Repository auszuschließen. Schließlich kann es Erscheinungen / Passwörter geben. Der Cache ist ebenfalls ausgeschlossen.
.gitignore /.idea/* /config/* /vendor/* /var/cache/* !/config/app.ini !/var/cache/.gitkeep
app / Support / CommandMap.php app / Support / Config.php app / Support / NotFoundHandler.php Jetzt können Sie PhpStorm beibringen, zu verstehen, welche Schlüssel Schlüssel haben und welchen Typ sie haben.
app / Support / ServiceProviderInterface.php app / Provider / AppProvider.php Wir haben das Routing in den Container verschoben, damit wir damit arbeiten können, ohne das Objekt \Slim\App
zu initialisieren.
Es wird empfohlen, dieser Datei die Berechtigung zur Ausführung zu erteilen
chmod +x ./bin/console
Überprüfung
Starten Sie die Konsolenanwendung:
./bin/console
Als Antwort sollte das Begrüßungsfenster für die symfony/console
mit zwei verfügbaren Befehlen symfony/console
werden - help
und list
.
Console Tool Usage: command [options] [arguments] Options: -h, --help Display this help message -q, --quiet Do not output any message -V, --version Display this application version --ansi Force ANSI output --no-ansi Disable ANSI output -n, --no-interaction Do not ask any interactive question -v|vv|vvv, --verbose Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug Available commands: help Displays help for a command list Lists commands
Starten Sie nun den Webserver.
php -S localhost:8080 -t public public/index.php
Und öffnen Sie eine beliebige URL auf localhost: 8080.
Alle Anfragen sollten eine Antwort mit dem Code 404
und einem leeren Text zurückgeben.
Dies geschieht, weil wir keine Routen aufgelistet haben.
Es bleibt uns überlassen, das Rendern zu verbinden, Vorlagen, Controller zu schreiben und Routen festzulegen.
Schritt 2. Rendern
Fügen Sie die template/layout.twig
. Dies ist die Grundvorlage für alle Seiten.
template / layout.twig {# template/layout.twig #} <!DOCTYPE html> <html lang="en"> <head> <title>{% block title %}Slim demo{% endblock %}</title> </head> <body> {% block content %}{% endblock %} </body> </html>
Fügen Sie eine template/hello.twig
eine Begrüßungsseitenvorlage template/hello.twig
template / hello.twig {# template/hello.twig #} {% extends 'layout.twig' %} {% block title %}Slim demo::hello, {{ name }}{% endblock %} {% block content %} <h1>Welcome!</h1> <p>Hello, {{ name }}!</p> {% endblock %}
Und die Fehlerseitenvorlage template/err404.twig
template / err404.twig {# template/err404.twig #} {% extends 'layout.twig' %} {% block title %}Slim demo::not found{% endblock %} {% block content %} <h1>Error!</h1> <p>Page not found =(</p> {% endblock %}
Fügen Sie die Rendering-Provider- app/Provider/RenderProvider.php
app / Provider / RenderProvider.php Schalten Sie den Provider im Bootstrap ein
Fügen Sie dem 404-Fehlerhandler ein Rendering hinzu
app / Support / NotFoundHandler.php (DIFF) app / Provider / AppProvider.php (DIFF) 404 .
3.
2:
app/Controller/HomeController.php
—app/Controller/HelloController.php
—
( URL ), — ( html)
app/Controller/HomeController.php app/Controller/HelloController.php ,
app/Provider/WebProvider.php - ( )...
php -S localhost:8080 -t public public/index.php
… http://localhost:8080 , http://localhost:8080/hello/world
world'.
http://localhost:8080/hello/ivan ivan'.
, , http://localhost:8080/helo/world 404 .
4.
route:list
app/Command/RouteListCommand.php ,
app/Provider/CommandProvider.php ...
./bin/console route:list
… :
Routes ====== --------------- --------- ------- ------------------------------------- Route Methods Name Handler --------------- --------- ------- ------------------------------------- / GET index App\Controller\HomeController:index /hello/{name} GET hello App\Controller\HelloController:show --------------- --------- ------- -------------------------------------
, , !
, Slim — routes.php
( ), . — , , .