PSR 7 与值对象(Value Objects)

最后更新于:2022-04-01 22:33:39

# 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 头的值对象。 ``` 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/) 了解关于这些方法的更多信息吧。
';