# PSR 7 與值對象(Value Objects)
Slim 為其請求和響應對象支持了 [PSR-7](https://github.com/php-fig/http-message) 接口。這使得 Slim 更加靈活了,因為它可以使用 _任意_ PSR-7 實現方法。例如,一個 Slim 應用程序不_必_返回一個 `\Slim\Http\Response` 的實例。它可以這樣子,舉例來說,比如返回一個 `\GuzzleHttp\Psr7\CachingStream` 的實例,或者,由 `\GuzzleHttp\Psr7\stream_for()` 函數返回的任意實例。
Slim 提供了它自有的 PSR-7 實現方法,使其可以開箱即用。然而,你可以自由地用第三方實現方法來替換 Slim 的默認 PSR 7 對象。只需覆寫應用容器的 `request` 和 `response` 服務,這樣它們就能分別返回一個 `\Psr\Http\Message\ServerRequestInterface` 和 `\Psr\Http\Message\ResponseInterface` 的實例。
## 值對象(Value objects)
Slim 的請求和響應對象是_不可改變的值對象。_. 只能通過請求一個有屬性值更新的克隆版本來改變它們。值對象有一個額定的開銷,因為它們必須在更新時進行克隆。這個開銷并不會以任何有實際意義的方式影響到性能。
你可以通過調用任意 PSR 7 接口方法來請求值對象的拷貝(這些方法通常帶有 `with` 前綴)。例如,一個 PSR 7 響應對象有一個 `withHeader($name, $value)` 方法,它返回一個克隆的帶有新 HTTP 頭的值對象。
```
<?php
$app = new \Slim\App;
$app->get('/foo', function ($req, $res, $args) {
return $res->withHeader(
'Content-Type',
'application/json'
);
});
$app->run();
```
PSR 7 接口提供了以下方法來轉換請求和響應對象:
* `withProtocolVersion($version)`
* `withHeader($name, $value)`
* `withAddedHeader($name, $value)`
* `withoutHeader($name)`
* `withBody(StreamInterface $body)`
PSR 7 接口提供了以下方法來轉換請求對象:
* `withMethod($method)`
* `withUri(UriInterface $uri, $preserveHost = false)`
* `withCookieParams(array $cookies)`
* `withQueryParams(array $query)`
* `withUploadedFiles(array $uploadedFiles)`
* `withParsedBody($data)`
* `withAttribute($name, $value)`
* `withoutAttribute($name)`
PSR 7 接口提供了以下方法來轉換響應對象:
* `withStatus($code, $reasonPhrase = '')`
訪問 [PSR-7 文檔](http://www.php-fig.org/psr/psr-7/) 了解關于這些方法的更多信息吧。