Vous connaissez le terme PSR, mais savez-vous réellement de quoi ça parle ?
Vous connaissez le terme PSR, mais savez-vous réellement de quoi ça parle ? C'est justement ce que nous allons voir aujourd'hui justement.
Le PSR, pour PHP Standard Recommendation, est un ensemble de recommandations pour la programmation PHP publiée par le FIG (Framework Interoperability Group). Il permet d'améliorer l'interopérabilité entre les frameworks mais aussi d'uniformiser les syntaxes et le formatage du code.
<?php
namespace Vendor\Package;
use FooInterface;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;
class Foo extends Bar implements FooInterface
{
public function sampleMethod($a, $b = null)
{
if ($a === $b) {
bar();
} elseif ($a > $b) {
$foo->bar($arg1);
} else {
BazClass::bar($arg2, $arg3);
}
}
final public static function bar()
{
// method body
}
}
<?php
namespace Vendor\Package;
use FooInterface;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;
class Foo extends Bar implements FooInterface
{
public function sampleMethod($a, $b = null)
{
if ($a === $b) {
bar();
} elseif ($a > $b) {
$foo->bar($arg1);
} else {
BazClass::bar($arg2, $arg3);
}
}
final public static function bar()
{
// method body
}
}
Le PSR3 définis une interface pour la gestion les logs avec 8 méthodes pour les différents niveaux et une générique.
<?php
namespace Psr\Log;
interface LoggerInterface
{
public function emergency(string $message, array $context = []): void;
public function alert(string $message, array $context = []): void;
public function critical(string $message, array $context = []): void;
public function error(string $message, array $context = []): void;
public function warning(string $message, array $context = []): void;
public function notice(string $message, array $context = []): void;
public function info(string $message, array $context = []): void;
public function debug(string $message, array $context = []): void;
public function log($level, string $message, array $context = []): void;
}
<?php
namespace Psr\Log;
interface LoggerInterface
{
public function emergency(string $message, array $context = []): void;
public function alert(string $message, array $context = []): void;
public function critical(string $message, array $context = []): void;
public function error(string $message, array $context = []): void;
public function warning(string $message, array $context = []): void;
public function notice(string $message, array $context = []): void;
public function info(string $message, array $context = []): void;
public function debug(string $message, array $context = []): void;
public function log($level, string $message, array $context = []): void;
}
<?php
namespace Psr\Log;
class LogLevel
{
const EMERGENCY = 'emergency';
const ALERT = 'alert';
const CRITICAL = 'critical';
const ERROR = 'error';
const WARNING = 'warning';
const NOTICE = 'notice';
const INFO = 'info';
const DEBUG = 'debug';
}
<?php
namespace Psr\Log;
class LogLevel
{
const EMERGENCY = 'emergency';
const ALERT = 'alert';
const CRITICAL = 'critical';
const ERROR = 'error';
const WARNING = 'warning';
const NOTICE = 'notice';
const INFO = 'info';
const DEBUG = 'debug';
}
<?php
namespace Psr\Log;
interface LoggerAwareInterface
{
public function setLogger(LoggerInterface $logger);
}
<?php
namespace Psr\Log;
interface LoggerAwareInterface
{
public function setLogger(LoggerInterface $logger);
}
Le PSR4 remplace le PSR0, qui est maintenant deprecated. Il permet de définir comment un fichier est chargé automatiquement grâce à son namespace. Exemple si on définit que le namespace App
est dans le dossier src
il va charger automatiquement tout le reste.
Chemin | Namespace |
---|---|
src/Foo/Bar | \App\Foo\Bar |
Le PSR6 définis 2 interfaces et 2 exceptions permettant une gestion de cache.
<?php
namespace Psr\Cache;
interface CacheItemInterface
{
public function getKey(): string;
public function get();
public function isHit(): bool;
public function set($value): self;
public function expiresAt(?\DateTimeInterface $expiration): self;
public function expiresAfter($time): self;
}
<?php
namespace Psr\Cache;
interface CacheItemInterface
{
public function getKey(): string;
public function get();
public function isHit(): bool;
public function set($value): self;
public function expiresAt(?\DateTimeInterface $expiration): self;
public function expiresAfter($time): self;
}
<?php
namespace Psr\Cache;
interface CacheItemPoolInterface
{
public function getItem(string $key): CacheItemInterface;
public function getItems(array $keys = []): \Traversable;
public function hasItem(string $key): bool;
public function clear(): bool;
public function deleteItem(string $key): bool;
public function deleteItems(array $keys): bool;
public function save(CacheItemInterface $item): bool;
public function saveDeferred(CacheItemInterface $item): bool;
public function commit(): bool;
}
<?php
namespace Psr\Cache;
interface CacheItemPoolInterface
{
public function getItem(string $key): CacheItemInterface;
public function getItems(array $keys = []): \Traversable;
public function hasItem(string $key): bool;
public function clear(): bool;
public function deleteItem(string $key): bool;
public function deleteItems(array $keys): bool;
public function save(CacheItemInterface $item): bool;
public function saveDeferred(CacheItemInterface $item): bool;
public function commit(): bool;
}
Le PSR7 définit 7 interfaces :
PSR11, avec l'arrivée du pattern Dependency Injection, la nécessité de devoir passer par un container pour gérer tout cela s'est posée.
<?php
namespace Psr\Container;
interface ContainerInterface
{
public function get(string $id);
public function has(string $id): bool;
}
<?php
namespace Psr\Container;
interface ContainerInterface
{
public function get(string $id);
public function has(string $id): bool;
}
Le PSR13 définis comment représenter un lien hypermédia via l'interface LinkInterface et la gestion d'un lien via EvolvableLinkInterface.
<?php
namespace Psr\Link;
interface LinkInterface
{
public function getHref(): string;
public function isTemplated(): bool;
public function getRels(): array;
public function getAttributes(): array;
}
<?php
namespace Psr\Link;
interface LinkInterface
{
public function getHref(): string;
public function isTemplated(): bool;
public function getRels(): array;
public function getAttributes(): array;
}
<?php
namespace Psr\Link;
interface EvolvableLinkInterface extends LinkInterface
{
public function withHref(string $href): self;
public function withRel(string $rel): self;
public function withoutRel(string $rel): self;
public function withAttribute(string $attribute, string $value): self;
public function withoutAttribute(string $attribute): self;
}
<?php
namespace Psr\Link;
interface EvolvableLinkInterface extends LinkInterface
{
public function withHref(string $href): self;
public function withRel(string $rel): self;
public function withoutRel(string $rel): self;
public function withAttribute(string $attribute, string $value): self;
public function withoutAttribute(string $attribute): self;
}
PSR15, avec l'arrivée du design pattern Middleware, le PSR7 devait donc être mis à jour et apporte la représentation d'un middleware. Il se place entre la Request et la Response.
Un exemple simple pour comprendre le fonctionnement est celui d'un firewall. Nous voulons autoriser l'accès à notre application uniquement pour une IP ou une plage. Nous n'allons pas rajouter avant chacune de nos routes cette détection. Et bien le middleware se greffe entre les 2 couches de l'application afin de faire son travail.
Le PSR16 est une simplification du PSR6. Il fusionne les concepts de Pool et Item dans une seule interface CacheInterface.
<?php
namespace Psr\SimpleCache;
interface CacheInterface
{
public function get(string $key, $default = null);
public function set(string $key, $value, $ttl = null): bool;
public function delete(string $key): bool;
public function clear(): bool;
public function getMultiple(string $keys, $default = null): iterable;
public function setMultiple(iterable $values, $ttl = null): bool;
public function deleteMultiple(iterable $keys): bool;
public function has(string $key): bool;
}
<?php
namespace Psr\SimpleCache;
interface CacheInterface
{
public function get(string $key, $default = null);
public function set(string $key, $value, $ttl = null): bool;
public function delete(string $key): bool;
public function clear(): bool;
public function getMultiple(string $keys, $default = null): iterable;
public function setMultiple(iterable $values, $ttl = null): bool;
public function deleteMultiple(iterable $keys): bool;
public function has(string $key): bool;
}
PSR17, encore une extension du PSR7 qui permet de ne plus être dépendant d'une implémentation de Request ou Response et de retourner notre propre implémentation.
PSR18, car le PSR7 était encore incomplet, ce standard rajoute la possibilité de créer des bibliothèques découplées des implémentations HTTP Client afin de les rendre réutilisables mais aussi d'utiliser le principe de substitution de Liskov.