文档/容器/服务/Response

响应对象

框架的Response服务包含用于生成客户端响应的全局数据。 在异步使用框架时,这些数据在每个请求结束后会恢复为默认值。

在控制器中为Response分配数据的方法:

// variant 1
use Hleb\Reference\ResponseInterface;
$this->container->get(ResponseInterface::class)->set('Hello, world!');

// variant 2
$this->container->response()->set('Hello, world!');

// variant 3
$this->response()->set('Hello, world!');

对于从Hleb\Base\Container继承的所有类,该方法是相似的,但在控制器外的Response中形成响应被认为是坏的实践。

在应用程序代码中使用Response的示例(此情况下代码也难以维护):

// variant 1
use Hleb\Static\Container;
use 
Hleb\Reference\ResponseInterface;
Container::get(ResponseInterface::class)->set('Hello, world!');

// variant 2
use Hleb\Static\Response;
Response::set('Hello, world!');

还可以通过接口Hleb\Reference\Interface\Response使用依赖注入访问Response服务。

为简化示例,之后仅包含通过DI的访问。

printecho输出结合,Response数据将后面显示,正确的策略是仅使用一种方法输出结果。

在请求结束时,框架无论如何都会引用指定的Response对象进行输出,即使该对象未从控制器返回。 这在单次或连续地在单个控制器方法中添加数据到Response时很方便。 如有需要操作包含不同数据的响应对象,任何其他符合PSR-7Response均可使用。 替代的Response必须在被调用的控制器方法中返回。


#响应体

响应体由添加到 Response 对象中的数据组成,可以转换为字符串。 通常是展示给用户的消息文本或者格式为 JSONXML 的数据,可能是动态生成的 HTML 等。

用于添加数据的 Response 服务方法有:
set()setBody() — 赋值数据,完全覆盖以前存在的响应体。
add()addToBody() — 在以前添加的数据末尾追加。

从服务中获取数据:
get()getBody() — 获取 Response 对象中当前响应体的状态。

在向客户端发送数据之前,确保其已检查 XSS 漏洞。 如果先前未处理过此类数据,可通过 PHP 函数 htmlspecialchars() 进行过滤。


#HTTP 响应状态

默认情况下,状态码设为 200。
如果响应需要设置不同的状态码,可以使用 setStatus() 方法,第一个参数为状态码,第二个为简短的状态消息,如果它与标准消息不同。 在 '404 Not Found' 状态中,该消息为 'Not Found'

通常使用标准状态消息,因此可以在 set() 方法中直接通过数字参数进行设置。

通过 getStatus() 方法,可以从 Response 服务中获取当前 HTTP 状态。


#响应头

除了全局服务器端响应头之外,您可以为框架返回的特定响应指定自己的头。 Response 服务的以下方法是为这第二种类型的头设计的。

<?php

namespace App\Controllers;

use 
Hleb\Base\Controller;
use 
Hleb\Reference\Interface\Request;
use 
Hleb\Reference\Interface\Response;

class 
ExampleController extends Controller
{
    public function 
index(Request $requestResponse $response): Response
    
{
        
$response->setHeader('Content-Type''application/json');

        
$headerData $response->getHeader('Content-Type');

        
var_dump($headerData); // array(1) { [0]=> string(16) "application/json" }

        
$response->setHeader('Content-Type''text/html; charset=utf-8');

        
$headerData $response->getHeader('Content-Type');

        
var_dump($headerData); // array(1) { [0]=> string(24) "text/html; charset=utf-8" }

        
return $response;
    }
}

setHeader() 方法根据名称设置头,如果先前有设置则覆盖其值。 在需要创建多个相同头的罕见情况下,replace 参数允许将头添加到当前值。

hasHeader() 方法检查名称是否存在头。

getHeader() 方法用于按名称获取头数据数组。

getHeaders() 方法以数组形式返回所有在 Response 中设置的头数据。

虽然使用标准 PHP 函数 对头的操作会共同起作用,但与 Response 对象一起使用时可能会出现冲突。 更好地在整个应用程序中只使用一种方法。


#HTTP 协议版本

默认的 HTTP 协议版本是 '1.1',除非从当前请求中确定。 因为返回值通常应与请求本身相匹配,所以很少需要更改。

尽管如此,getVersion()setVersion() 方法被用于分别获取和设置版本。

Request 缓存

页面翻译:chatgpt 4-o
返回顶部