PSR-7 和值对象

对于其请求和响应对象,Slim 支持 PSR-7 接口。这使得 Slim 具有灵活性,因为它可以使用任何 PSR-7 实现。例如,您可以返回 GuzzleHttp\Psr7\CachingStream 的实例或由 GuzzleHttp\Psr7\stream_for() 函数返回的任何实例。

Slim 提供其自己的 PSR-7 实现。但是,您可以随意安装第三方实现

值对象

请求和响应对象是 不可变的值对象。它们只能通过请求具有已更新属性值的克隆版本来“更改”。值对象具有标称开销,因为当更新其属性时必须对其进行克隆。此开销不会以任何有意义的方式影响性能。

您可以通过调用其任何 PSR-7 接口方法(这些方法通常带有 with 前缀)来请求值对象副本。例如,PSR-7 响应对象具有 withHeader($name, $value) 方法,该方法返回一个具有新 HTTP 标头的克隆值对象。

<?php

use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use Slim\Factory\AppFactory;

require __DIR__ . '/../vendor/autoload.php';

$app = AppFactory::create();

$app->get('/foo', function (Request $request, Response $response, array $args) {
    $payload = json_encode(['hello' => 'world'], JSON_PRETTY_PRINT);
    $response->getBody()->write($payload);
    return $response->withHeader('Content-Type', 'application/json');
});

$app->run();

PSR-7 接口提供这些方法来转换请求和响应对象

  • withProtocolVersion($version)
  • withHeader($name, $value)
  • withAddedHeader($name, $value)
  • withoutHeader($name)
  • withBody(StreamInterface $body)

PSR-7 接口提供这些方法来转换 Request 对象

  • 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 接口提供这些方法来转换 Response 对象

  • withStatus($code, $reasonPhrase = '')

有关这些方法的详细信息,请参阅 PSR-7 文档