Lab 14: API Design & PSR

Time: 40 minutes | Level: Advanced | Docker: docker run -it --rm php:8.3-cli bash

PSR-7 standardizes HTTP message objects. PSR-15 defines middleware and request handlers. PSR-17 provides factories. PSR-18 standardizes HTTP clients. Together they enable framework-agnostic, testable HTTP applications.


Step 1: Install PSR-7 Implementation

docker run --rm php:8.3-cli sh -c "
cd /tmp && mkdir psr7demo && cd psr7demo &&
php -r \"copy('https://getcomposer.org/installer', 'cs.php');\" &&
php cs.php --quiet && mv composer.phar /usr/local/bin/composer &&
composer require --no-progress nyholm/psr7 nyholm/psr7-server 2>&1 | tail -5 &&
echo '---' &&
php -r \"
require 'vendor/autoload.php';
\\\$factory = new \Nyholm\Psr7\Factory\Psr17Factory();
\\\$request = \\\$factory->createRequest('GET', 'https://api.example.com/users?page=1');
echo \\\$request->getMethod() . ' ' . \\\$request->getUri() . PHP_EOL;
echo 'Query: ' . \\\$request->getUri()->getQuery() . PHP_EOL;
\"
"

📸 Verified Output:


Step 2: PSR-7 Request & Response

📸 Verified Output:


Step 3: PSR-15 Middleware


Step 4: Middleware Pipeline (PSR-15)

📸 Verified Output:


Step 5: API Versioning Strategies

📸 Verified Output:


Step 6: PSR-18 HTTP Client

📸 Verified Output:


Step 7: OpenAPI-Style Attribute Annotations

📸 Verified Output:


Step 8: Capstone — Full REST API Handler

📸 Verified Output:


Summary

PSR
Purpose
Key Interface

PSR-7

HTTP messages (request/response)

RequestInterface, ResponseInterface

PSR-15

Middleware & request handlers

MiddlewareInterface, RequestHandlerInterface

PSR-17

HTTP factory

RequestFactoryInterface, ResponseFactoryInterface

PSR-18

HTTP client

ClientInterface::sendRequest()

Immutability

PSR-7 objects are immutable

with*() returns new instance

Middleware pattern

Wraps handler in decorators

Chain processes request

API versioning

URL / Header / Content-Type

Choose one, stay consistent

OpenAPI

#[ApiOperation] attributes

Generate spec via Reflection

Last updated