PSR 7 and Value Objects
Slim supports PSR-7 interfaces for its Request and Response objects. This makes Slim flexible because it can use any PSR-7 implementation. For example, a Slim application route does not have to return an instance of SlimHttpResponse
. It could, for example, return an instance of GuzzleHttpPsr7CachingStream
or any instance returned by theGuzzleHttpPsr7stream_for()
function.
Slim provides its own PSR-7 implementation so that it works out of the box. However, you are free to replace Slim’s default PSR 7 objects with a third-party implementation. Just override the application container’s request
and response
services so they return an instance ofPsrHttpMessageServerRequestInterface
andPsrHttpMessageResponseInterface
, respectively.
Value objects
Slim’s Request and Response objects are immutable value objects. They can be “changed” only by requesting a cloned version that has updated property values. Value objects have a nominal overhead because they must be cloned when their properties are updated. This overhead does not affect performance in any meaningful way.
You can request a copy of a value object by invoking any of its PSR 7 interface methods (these methods typically have a with
prefix). For example, a PSR 7 Response object has awithHeader($name, $value)
method that returns a cloned value object with the new HTTP header.
<?php
$app = new SlimApp;
$app->get("/foo", function ($req, $res, $args) {
return $res->withHeader(
"Content-Type",
"application/json"
);
});
$app->run();
The PSR 7 interface provides these methods to transform Request and Response objects:
withProtocolVersion($version)
withHeader($name, $value)
withAddedHeader($name, $value)
withoutHeader($name)
withBody(StreamInterface $body)
The PSR 7 interface provides these methods to transform Request objects:
withMethod($method)
withUri(UriInterface $uri, $preserveHost = false)
withCookieParams(array $cookies)
withQueryParams(array $query)
withUploadedFiles(array $uploadedFiles)
withParsedBody($data)
withAttribute($name, $value)
withoutAttribute($name)
The PSR 7 interface provides these methods to transform Response objects:
withStatus($code, $reasonPhrase = "")
Refer to the PSR-7 documentation for more information about these methods.