PSR-7 et Symfony

logo_php

Début Mai 2015, la communauté PHP acceptait la norme PSR-7 appelée « HTTP message interfaces », nous donnant ainsi une façon commune de concevoir les messages HTTP.

Il s’agit d’une importante avancée vers une meilleure standardisation et interopérabilité en PHP, ceci plus particulièrement pour les middlewares (des bibliothèques qui s’intègrent entre une requête et une réponse HTTP). Dans le futur, un middleware qui sera écrit autour de ces nouvelles interfaces pourra être utilisé dans n’importe quel framework.

Présentation de PSR HTTP message Bridge

Les messages via le protocol HTTP sont le fondement du développement web. On retrouve ce principe sur chaque navigateur web mais aussi chez les clients Http tel que cURL.

Plusieurs projets à ce jour utilisent les classes Request et Response que propose Symfony via le composant HttpFoundation, y compris Laravel, Drupal 8 et StackPHP.

HttpFoundation remplace ce que PHP représenterait par une requête les variables ($_GET, $_POST, $SESSION…) par un ensemble Orienté Objet.

Pour cette raison, Symfony a annoncé fin mai 2015 la version 0.1 du PSR HTTP Message Bridge : une bibliothèque permettant de convertir dans un sens ou dans l’autre les objets Request et Response de Symfony en une version compatible avec PSR-7. En d’autres termes, dès qu’il y aura des middlewares respectant la norme PSR-7, toute application utilisant HttpFoundation sera aussi compatible.

Voici comment convertir un objet PSR-7 en un objet HttpFoundation :

use Symfony\Bridge\PsrHttpMessage\Factory\HttpFoundationFactory;
$httpFoundationFactory = new HttpFoundationFactory();
// convert a Request
// $psrRequest is an instance of Psr\Http\Message\ServerRequestInterface
$symfonyRequest = $httpFoundationFactory->createRequest($psrRequest);
// convert a Response
// $psrResponse is an instance of Psr\Http\Message\ResponseInterface
$symfonyResponse = $httpFoundationFactory->createResponse($psrResponse);

A l’inverse, il est également possible de convertir un objet HttpFoundation en un objet PSR-7. Pour cela la bibliothèque Diactoros qui implémente cette norme est utilisée :

use Symfony\Bridge\PsrHttpMessage\Factory\DiactorosFactory;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

$psr7Factory = new DiactorosFactory();

// convert a Request
$symfonyRequest = Request::createFromGlobals();
$psrRequest = $psr7Factory->createRequest($symfonyRequest);

// convert a Response
$symfonyResponse = new Response('Content');
$psrResponse = $psr7Factory->createResponse($symfonyResponse);

Grâce à ceci, chaque projet pourra bénéficier immédiatement des avantages de cette norme sans risque d’incompatibilité. Cette approche a été choisie car depuis sa version 2.3, Symfony a mis en place des engagements clairs en terme de maintien de compatibilité de ses nouvelles versions.

RequestInterface et ResponseInterface dans le framework Symfony

Sur un projet utilisant Symfony, un contrôleur reçoit habituellement une Request Symfony et retourne une Response Symfony. Maintenant, il sera aussi possible d’utiliser une Request et une Response suivant la norme PSR-7 grâce à un patch du SensioFrameworkExtraBundle, voici comment :

namespace AppBundle\Controller;

use Psr\Http\Message\ServerRequestInterface;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Zend\Diactoros\Response;

class DefaultController extends Controller
{
    public function indexAction(ServerRequestInterface $request)
    {
        // Interact with the PSR-7 request

        $response = new Response();
        // Interact with the PSR-7 response

        return $response;
    }
}

Tout ceci est disponible depuis la version 3.0.7 de SensioFrameworkExtraBundle, qui est donc compatible avec toutes les versions de Symfony maintenues (2.3+). Si cela vous intéresse de l’utiliser dans vos contrôleurs, vous pouvez commencer à le faire immédiatement!

Nous reviendrons plus en détails dans un prochain article sur les avantages de PSR-7 et des middlewares.

Sources : Blog Symfony, documentation Symfony

 

 

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

cinq + 3 =