Le PSR, c'est un diminutif qui revient de plus en plus souvent au sein de la communauté PHP lorsque l'on parle d'autoloader (PSR4), de formatage de code (PSR2) ou d'interfaces (PSR7). Mais de qu'est ce qu'un PSR et à quoi corresponds ces chiffres ?
Avant de commencer à parler des PSR, il est important de comprendre le groupe qui est derrière ces standards : le FIG.
Qu'est-ce que le FIG ? Quel objectif ?
L'objectif du FIG est d'améliorer l'interopérabilité entre les Frameworks en réfléchissant à des solutions communes pour uniformiser certaines choses. Le but du groupe n'est pas d'imposer une vision particulière sur la manière de faire les choses, mais plutôt de chercher un moyen de faire fonctionner les frameworks ensemble. C'est d'ailleurs pour cette raison que le groupe, anciennement nommé "PHP Standards Group", a choisi de se renommer en "FIG", pour Framework Interoperability Group, afin de mieux refléter ses objectifs.
Le groupe, représentatif de l'écosystème PHP, émet ses recommandations sous forme de PSR (PHP Standard Recommendation) qui doivent passer par une série d'étapes pour être validées.
- Pre-Draft. Pendant cette phase les membres décident si le concept est intéressant et forment un groupe de travail qui sera responsable de la rédaction du standard.
- Draft. Le groupe de travail créé va travailler sur le standard et le modifier jusqu'à le rendre présentable au Core Committee.
- Review. Pendant cette phase, des implémentations sont essayées. Si, après 4 semaines minimum, 2 implémentations viables peuvent être démontrées, le standard peut passer au vote d'acceptation final.
- Accepté. Si le vote final passe, le standard devient officiellement accepté et le groupe de travail est dissous.
- Déprécié. Un standard peut devenir déprécié si il n'est plus pertinent.
- Abandonné. Un standard peut être abandonné s'il n'y a plus d'activité dessus pendant plus de 6 mois ou suite à un vote du Core Committee.
Slides présentés dans la vidéo
Recommandations acceptées
Pour le moment 9 PSR ont été acceptées et sont déjà largement adoptées par la communauté.
PSR 1 & PSR 2 : Coding Style
Ces 2 PSR posent des standards concernant le style du code PHP et le formatage à adopter (nombre d'espaces, nommage des classes, placement de la ponctuation...). Il est déjà largement supporté par les IDE et les outils (type PHPCS). La portée de ces PSR sera encore améliorée avec l'arrivée prochainement du PSR12.
PSR 3 : Logger Interface
Ce PSR définit une interface qui permet de représenter un système capable d'écrire des logs. Cette interface LoggerInterface
définit 9 méthodes
- 8 méthodes correspondant aux différents niveaux de logs (debug, info, notice, warning, error, critial, alert, emergency).
- 1 méthode plus générique log qui accepte en premier paramètre le niveau d'erreur.
PSR 4 : Autoloading
Venu en remplacement du PSR 0, qui est aujourd'hui déprécié, le PSR4 définit comment le chemin d'un fichier peut être résolu à partir de son namespace. En résumé :
- Un dossier est associé à un namespace spécifique
- Le chemin des classes dans ce namespace doit correspondre au nom du namespace
Par exemple si on spécifie que App\
se trouve dans le dossier src/
alors la classe App\Database\PostRepository
sera dans le fichier src/Database/PostRepository.php
.
Cette recommandation est importante et permet à des outils comme Composer de fonctionner et de générer un autoloader à partir des dépendances chargées.
PSR 6 : Caching Interface
Comme son nom l'indique, cette PSR permet de définir plusieurs interfaces pour interagir avec le cache. On aura une classe pour représenter le cache de manière globale CacheItemPoolInterface
et une autre interface pour définir les objets qui seront mis en caches CacheItemInterface
.
PSR 7 : Http Message Interface
Cette recommandation est une des recommandations les plus importantes et définit de nombreuses interfaces liées à la représentation, sous forme d'objets, de messages HTTP
- Une interface générique
MessageInterface
permet de décrire simplement un message (avec un protocole, des en-têtes et un corps) - Une interface
RequestInterface
qui étend laMessageInterface
en y ajoutant les concepts de cible, de méthode et d'URL - Une interface
ServerRequestInterface
qui étend laRequestInterface
avec la gestion des paramètres d'url, des cookies, des fichiers uploadés, des données postées et un système d'attributs permettant de passer des informations. - Une interface
ResponseInterface
qui étend laMessageInterface
pour représenter une réponse à renvoyer au navigateur (ou reçu suite à un appel à une API) qui ajoute simplement la notion de statut.
En plus de ces interfaces, d'autres interfaces ont été ajoutées pour représenter certains concepts :
StreamInterface
permet de représenter un flux de données et est utilisé pour décrire le corps d'un message.UriInterace
permet de représenter un lien (schéma, nom d'hôte et chemin).UploadedFileInterface
représente un fichier uploadé reçu par le serveur et est utilisé par l'interfaceServerRequestInterface
.
PSR 11 : Container Interface
L'injection de dépendance est devenue un pattern incontournable en PHP et passe nécessairement par un container. Cette recommandation permet d'uniformiser l'accès aux dépendances grâce à la définition d'une interface ContainerInterface
qui possède 2 méthodes :
get(string $id)
pour récupérer un élément dans le containerhas(string $id)
pour vérifier si un élément existe dans le container
PSR-13 : Link definition interfaces
Sûrement la recommandation la plus spécifique, elle permet, gràce à l'interface LinkInterface
, de définir comment représenter sous forme d'objet un lien hypermédia.
PSR 16 : Simple Cache
Cette recommandation fournit les mêmes fonctionnalités que la recommandation PSR 6 mais simplifie l'interface en fusionnant les concepts de Pool et d'Item pour ne proposer qu'une seule interface CacheInterface
.
Les recommandations à venir
D'autres recommandations sont en cours d'étude (draft) et permettent d'avoir un aperçu des recommandations à venir.
PSR 5 : PHPDoc Standard
L'objectif est de créer un standard basé sur phpDocumentor afin d'uniformiser les choses et de supporter les nouvelles fonctionnalités de PHP.
PSR 9 & PSR 10 : Security Advisories & Reporting
Plutôt destinées aux éditeurs de Framework / Librairies l'objectif de ces 2 recommandations et de définir le processus pour dévoiler et reporter les problèmes de sécurité.
PSR 12 : Extended Coding Style Guide
Cette recommandation va étendre le PSR 2 en proposant des règles de formatage qui couvrent plus de cas comme par exemple le formatage de namespace multiligne ou le formatage de code PHP mélangé à de l'HTML.
PSR 14 : Event Manager
Cette recommandation permet d'uniformiser le système d'évènement déjà présent sur de multiples frameworks grâce à 2 interfaces.
EventInterface
qui servira à représenter un évènementEventManagerInterface
qui permettra d'enregistrer les différents "écouteurs" associés à un évènement.
PSR 15 : HTTP Middleware
L'apparition du PSR 7 a permis d'uniformiser la représentation de la requête et de la réponse et a donné lieu à l'adoption du design pattern Middleware. L'objectif de cette recommandation est d'uniformiser la représentation d'un middleware tout en proposant une signature qui limite au maximum les problèmes de conception.
PSR 17 : HTTP Factory
Lorsque l'on choisit dans une méthode de renvoyer une réponse on est obligé de renvoyer une implémentation de l'interface PSR7 ce qui rend notre classe dépendante de cette implémentation. L'objectif de cette recommandation est d'offrir une interface pour des factories liées aux objets HTTP. En injectant la factoy comme dépendance de notre classe, on s'assure de ne plus dépendre d'une implémentation spécifique de Response ou de Request.