Php Slim Framework 3-响应对象

Php Slim Framework 3-响应对象,php,slim-3,Php,Slim 3,在我的Slim 3应用程序中,我定义了一个中间件,它将自定义头添加到我的响应中。在调用索引路由函数之前调用中间件。如果抛出异常,将调用错误处理程序函数,但传递给该函数的$response对象似乎是一个新的响应对象,而不是在我的中间件中自定义的对象。换句话说,在我的回复中,我没有自定义标题 这种行为正确吗 # Middleware $app->add(function ($request, $response, $next) { $response = $response->wit

在我的Slim 3应用程序中,我定义了一个中间件,它将自定义头添加到我的响应中。在调用索引路由函数之前调用中间件。如果抛出异常,将调用错误处理程序函数,但传递给该函数的$response对象似乎是一个新的响应对象,而不是在我的中间件中自定义的对象。换句话说,在我的回复中,我没有自定义标题

这种行为正确吗

# Middleware
$app->add(function ($request, $response, $next) {
  $response = $response->withHeader('MyCustomHeader', 'MyCustomValue');
  return $next($request, $response);
});

# Error handling
$container['errorHandler'] = function ($container) {
  return function ($request, $response, $exception) use ($container) {
    return $response->write('ERROR');
  };
};

# Index
$app->get('/index', function(Request $request, Response $response) {
  throw new exception();
  return $response->write('OK');
});
是的,这是正确的,因为:

请求
响应
对象是不可变的,因此需要通过所有函数传递它们。当抛出异常时,此链将断开,新创建的响应对象(在
withHeader
-method上)无法传递给errorHandler

您可以通过抛出一个
\Slim\Exception\SlimException
来修复该问题,该异常接受2个参数。请求和响应。使用此Slim,将使用错误处理程序内异常中给出的请求和响应

$app->get('/index', function(Request $request, Response $response) {
    throw new \Slim\Exception\SlimException($request, $response);
    return $response->write('OK');
});