HTTP Message
Note: The HTTP message library is part of the Berlioz ecosystem but is available as a standalone package:
berlioz/http-message.
You can find it on Packagist.
You can use it independently of the framework, in any PHP application.
Berlioz HTTP Message is a PHP library that implements PSR-7 (HTTP message interfaces) and PSR-17 (HTTP Factories) standards.
PSR references
Looks at PSR documentations:
- PSR-7 (HTTP message interfaces): https://www.php-fig.org/psr/psr-7/
- PSR-17 (HTTP Factories): https://www.php-fig.org/psr/psr-17/
Factory
Only one factory class implements the PSR-17:
\Berlioz\Http\Message\HttpFactory
To help you, the factory is cut into some traits:
\Berlioz\Http\Message\Factory\RequestFactoryTrait\Berlioz\Http\Message\Factory\ResponseFactoryTrait\Berlioz\Http\Message\Factory\ServerRequestFactoryTrait\Berlioz\Http\Message\Factory\StreamFactoryTrait\Berlioz\Http\Message\Factory\UploadedFileFactoryTrait\Berlioz\Http\Message\Factory\UriFactoryTrait
Specialized Streams
Beyond the base Stream class, several specialized stream implementations are available:
Stream\MemoryStream: In-memory stream backed byphp://memoryStream\FileStream: Opens a file on disk as a streamStream\PhpInputStream: Cachesphp://input(readable only once) for safe multiple readsStream\GzStream: Gzip-compressed stream using thezlibextensionStream\GzFileStream: Opens a gzip-compressed file on diskStream\Base64Stream: Transparent base64 encoding via PHP stream filtersStream\AppendStream: Concatenates multiple streams into a single read-only virtual streamStream\MultipartStream: Builds MIME multipart bodies (e.g. formultipart/form-datarequests)
Example with MultipartStream:
use Berlioz\Http\Message\Stream\MultipartStream;
$multipart = new MultipartStream();
$multipart->addElements(['field1' => 'value1', 'field2' => 'value2']);
$multipart->addFile('file', '/path/to/file.pdf');
$contentType = 'multipart/form-data; boundary=' . $multipart->getBoundary();
Body parsers
The Message class includes a body parser registry. Built-in parsers handle common content types:
application/jsonviaJsonParserapplication/x-www-form-urlencodedviaFormUrlEncodedParsermultipart/form-dataviaFormDataParser
You can register custom parsers for any MIME type:
use Berlioz\Http\Message\Message;
Message::addBodyParser('application/xml', MyXmlParser::class);
The parser class must implement Berlioz\Http\Message\Parser\ParserInterface.
Content-type suffixes are handled automatically (e.g. application/vnd.api+json resolves to the json parser).
Additional methods
Some methods are provided beyond the PSR-7/PSR-17 standards:
ServerRequest::getServerParam(string $name, mixed $default = null): mixed— single server parameter accessServerRequest::getQueryParam(string $name, mixed $default = null): mixed— single query parameter accessServerRequest::isAjaxRequest(): bool— detects AJAX requestsUri::getQueryValue(string $name, mixed $default = null): mixed— extract a single query parameter from the URIUri::withAddedQuery(string $query): static— merge additional query parametersUri::withoutQuery(string $name): static— remove a query parameterUploadedFile::getHash(string $algo = 'sha1'): string— compute a file content hashUploadedFile::getMediaType(): ?string— server-side MIME detection viafinfo