PSR 7 与值对象(Value Objects)

Slim 为其请求和响应对象支持了 PSR-7 接口。这使得 Slim 更加灵活了,因为它可以使用 任意 PSR-7 实现方法。例如,一个 Slim 应用程序不返回一个 \Slim\Http\Response 的实例。它可以这样子,举例来说,比如返回一个 \GuzzleHttp\Psr7\CachingStream 的实例,或者,由 \GuzzleHttp\Psr7\stream_for() 函数返回的任意实例。

Slim 提供了它自有的 PSR-7 实现方法,使其可以开箱即用。然而,你可以自由地用第三方实现方法来替换 Slim 的默认 PSR 7 对象。只需覆写应用容器的 requestresponse 服务,这样它们就能分别返回一个 \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 文档 了解关于这些方法的更多信息吧。