Le 25 avril 2019, la nouvelle version alpha
majeure du microframework Slim a vu le jour, et le 18 mai elle est passée en beta
. Je vous suggère de vous familiariser avec la nouvelle version.
Sous la coupe:
- À propos des innovations du cadre
- Écrire une application simple sur Slim-4
- À propos de l'amitié Slim et PhpStorm
Nouveau dans Slim 4
Innovations clés par rapport à la version 3:
- La version minimale de PHP est 7.1;
- Prise en charge de PSR-15 (middleware);
- Suppression de l'implémentation des messages http. Installez n'importe quelle bibliothèque compatible PSR-7 et utilisez-la;
- Suppression de la dépendance Pimple . Installez votre conteneur compatible PSR-11 préféré et utilisez-le;
- La possibilité d'utiliser votre routeur (Auparavant, il n'était pas possible d'abandonner FastRoute );
- Modification de l'implémentation de la gestion des erreurs;
- Modification de l'implémentation de la sortie de réponse;
- Ajout d'une fabrique pour créer une instance de l'application;
- Paramètres supprimés;
- Slim ne définit plus
default_mimetype
sur une chaîne vide, vous devez donc l'installer vous-même dans php.ini
ou dans votre application en utilisant ini_set('default_mimetype', '')
; - Le gestionnaire de demande d'application accepte désormais uniquement l'objet de demande (dans l'ancienne version, il acceptait les objets de demande et de réponse).
Comment créer une application maintenant?
Dans la troisième version, la création de l'application ressemblait à ceci:
<?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();
Le constructeur d'application accepte maintenant les paramètres suivants:
Vous pouvez également utiliser la méthode de create
statique de l'application factory \Slim\Factory\AppFactory
.
Cette méthode accepte les mêmes paramètres en entrée, seuls tous sont facultatifs.
<?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();
Rendez-moi 404 erreurs!
Si nous essayons d'ouvrir une page inexistante, nous obtenons un code de réponse de 500
, pas 404
. Pour que les erreurs soient traitées correctement, vous devez vous connecter \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
Le middleware devrait désormais être une implémentation PSR-15. À titre d'exception, vous pouvez transmettre des fonctions, mais la signature doit correspondre à la méthode process()
de l' \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'); });
La signature ($request, $response, $next)
n'est plus prise en charge
Comment vivre sans paramètres?
Vous pouvez vivre sans paramètres. Les outils fournis nous y aideront.
httpVersion
et responseChunkSize
Le httpVersion
était responsable de la sortie de la version du protocole dans la réponse.
Le paramètre responseChunkSize
déterminé la taille de chaque bloc lu dans le corps de la réponse lors de son envoi au navigateur.
Maintenant, ces fonctions peuvent être attribuées à l'émetteur de la réponse.
Écrire l'émetteur
<?php
Nous nous connectons Ă l'application
<?php use App\ResponseEmitter; use Slim\Factory\AppFactory; require 'vendor/autoload.php'; $app = AppFactory::create(); $serverRequestFactory = \Slim\Factory\ServerRequestCreatorFactory::create(); $request = $serverRequestFactory->createServerRequestFromGlobals();
outputBuffering
Ce paramètre a permis d'activer / désactiver la mise en mémoire tampon de sortie. Définition des valeurs:
false
- la mise en mémoire tampon est désactivée (tous les appels à l' echo
, print
instructions d' print
sont ignorés).'append'
- tous les appels Ă l' echo
, print
instructions print
sont ajoutées après le corps de la réponse'prepend'
- tous les appels Ă l' echo
, print
instructions print
sont ajoutées avant le corps de la réponse
\Slim\Middleware\OutputBufferingMiddleware
développeurs de \Slim\Middleware\OutputBufferingMiddleware
proposent de remplacer cette option par le \Slim\Middleware\OutputBufferingMiddleware
, dans le constructeur duquel une fabrique de flux compatible PSR-17 et un mode pouvant être égal à append
ou Ă append
prepend
<?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
Ce paramètre a permis d'obtenir l'itinéraire actuel à partir de l'objet requête dans le middleware
Un remplacement est fourni \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
Le paramètre permettait d'afficher les détails de l'erreur. Lors du débogage, cela facilite la vie.
Rappelez-vous \Slim\Middleware\ErrorMiddleware
? Ici, cela nous aidera!
<?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
Ce paramètre a permis d'activer / désactiver l'ajout automatique de l'en Content-Length
tĂŞte Content-Length
avec la valeur du volume de données dans le corps de la réponse
Remplace l'option middleware \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
Vous pouvez maintenant installer directement le fichier cache du routeur
<?php use Slim\Factory\AppFactory; require 'vendor/autoload.php'; $app = AppFactory::create(); $app->getRouteCollector()->setCacheFile('/path/to/cache/router.php');
Création d'une application sur Slim-4
Pour regarder de plus près le framework, nous allons écrire une petite application.
L'application aura les itinéraires suivants:
/hello/{name}
- page d'accueil;/
- rediriger vers la page /hello/world
- Les autres itinéraires renverront une page personnalisée avec 404 erreurs.
La logique sera dans les contrôleurs, nous rendrons la page via le moteur de modèle Twig
En bonus, ajoutez une application console basée sur le composant Symfony Console avec une commande qui affiche une liste de routes
Étape 0. Installation des dépendances
Nous aurons besoin de:
J'ai sélectionné ultra-lite / container comme conteneur de dépendance, léger, concis et conforme à la norme.
Les développeurs PSR-7 et PSR-17 Slim fournissent slim / psr7 dans un seul paquet. Nous allons l'utiliser
Il est supposé que le gestionnaire de packages Composer est déjà installé.
Nous créons un dossier pour le projet ( /path/to/project
sera utilisé comme exemple) et y allons.
Ajoutez le fichier composer.json
au projet avec le contenu suivant:
{ "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" } } }
et exécutez la commande
composer install
Nous avons maintenant tous les packages nécessaires et le chargeur automatique de classe est configuré.
Si nous travaillons avec git , ajoutez le fichier .gitignore
et ajoutez-y le répertoire du vendor
(et le répertoire de votre IDE si nécessaire)
/.idea/* /vendor/*
J'utilise l'IDE PhpStorm et fier de ça . Pour un développement confortable, il est temps de se faire des amis avec le conteneur et l'IDE.
À la racine du projet, créez le fichier .phpstorm.meta.php
et écrivez-y le code suivant:
<?php
Ce code indiquera à l'EDI que pour un objet qui implémente l' \Psr\Container\ContainerInterface
, la méthode get()
retournera un objet de classe ou une implémentation d'interface dont le nom est passé dans le paramètre.
Étape 1. Cadre d'application
Ajoutez les répertoires:
app
- code d'application. Nous allons y connecter notre espace de noms pour le chargeur automatique de classe;bin
- répertoire pour l'utilitaire de console;config
- voici les fichiers de configuration de l'application;public
- un répertoire ouvert sur le Web (point d'entrée d'application, styles, js, images, etc.);template
- répertoire de template
;var
est le répertoire de divers fichiers. Journaux, cache, stockage local, etc.
Et les fichiers:
config/app.ini
- la configuration principale de l'application;config/app.local.ini
- configuration pour local
environnement local
;app/Support/CommandMap.php
- mappage des commandes d'application de la console pour le chargement paresseux.app/Support/Config.php
- Classe de configuration (pour que l'EDI sache quelles configurations nous avons).app/Support/NotFoundHandler.php
- Classe de gestionnaire d'erreurs 404.app/Support/ServiceProviderInterface.php
- L'interface du fournisseur de services.app/Provider/AppProvider.php
- Le principal fournisseur de l'application.bootstrap.php
- assemblage de conteneur;bin/console
- point d'entrée de l'application console;public/index.php
- point d'entrée de l'application Web.
config / app.ini ; slim.debug=Off ; templates.dir=template ; templates.cache=var/cache/template
config / app.local.ini ; . ; slim.debug=On ; templates.cache=
Oh oui, il est toujours agréable d'exclure les configurations d'environnement du référentiel. Après tout, il peut y avoir des apparences / mots de passe. Le cache est également exclu.
.gitignore /.idea/* /config/* /vendor/* /var/cache/* !/config/app.ini !/var/cache/.gitkeep
app / Support / CommandMap.php app / Support / Config.php app / Support / NotFoundHandler.php Vous pouvez maintenant apprendre à PhpStorm à comprendre quelles clés ont des clés et de quel type elles sont.
app / Support / ServiceProviderInterface.php app / Provider / AppProvider.php Nous avons déplacé le routage vers le conteneur afin de pouvoir travailler avec lui sans initialiser l'objet \Slim\App
.
Il est conseillé de donner à ce fichier l'autorisation d'exécuter
chmod +x ./bin/console
Vérification
Lancez l'application console:
./bin/console
En réponse, la fenêtre de bienvenue du composant symfony/console
devrait apparaître avec deux commandes disponibles - help
et 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
Démarrez maintenant le serveur Web.
php -S localhost:8080 -t public public/index.php
Et ouvrez n'importe quelle URL sur localhost: 8080.
Toutes les demandes doivent renvoyer une réponse avec le code 404
et un corps vide.
Cela se produit car nous n'avons aucun itinéraire répertorié.
Il nous reste à connecter le rendu, écrire des modèles, des contrôleurs et définir des routes.
Étape 2. Rendu
Ajoutez le modèle template/layout.twig
. Il s'agit du modèle de base pour toutes les pages.
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>
Ajouter un template/hello.twig
page d'accueil 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 %}
Et le template/err404.twig
page d'erreur 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 %}
Ajoutez l' app/Provider/RenderProvider.php
fournisseur de rendu app/Provider/RenderProvider.php
app / Provider / RenderProvider.php Activer le fournisseur dans bootstrap
Ajouter un rendu au gestionnaire d'erreurs 404
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
( ), . — , , .