如何从子函数调用返回 Slim 响应?



这个控制器(通过__invoke函数调用(调用另一个函数来处理一些数据,我想从第二个函数返回一个错误响应processData,可能吗?

public function __invoke(ServerRequestInterface $request, ResponseInterface $response, array $args)
{
$someData = ...;
$processedData = $this->processData($someData, $response);
return $response->withJson($processedData);
}
private function processData(ResponseInterface $response)
{
...
$error = true; // simulate error
if($error){
return $response->withJson('error', 500);
} else {
return $processedData;
}
}

从子函数调用返回错误响应不起作用,因为响应必须从主函数返回。

我怎样才能做到这一点?

一种解决方案是从子函数中抛出错误,但我想返回适当的微小响应。

据我了解processData()在发生任何错误时返回响应对象,但否则返回另一种类型的数据。这意味着此方法在不同情况下返回两种不同类型的数据,因此在控制器中,您需要以不同的方式处理其返回值:如果它返回响应对象,您可以按原样返回它,但如果它返回处理后的数据,则需要返回使用该数据构建的 json 响应...这让事情变得有点混乱。

你关于抛出错误的想法似乎很好,你应该知道你可以(并且你必须(在发生任何错误时返回正确的响应。这就是为什么 Slim 错误处理程序应该返回响应对象的原因。

为了重构您的代码,我看到了以下选项:

  1. processData()中抛出异常并定义一些自定义异常类,并编写一个好的错误处理程序以生成正确的错误响应(推荐(
private function processData(ResponseInterface $response)
{
...
$error = true; // simulate error
if($error){
throw new DataProcessingException('Details about why this happened');
}
return $processedData;
}
// in your controller
public function __invoke(ServerRequestInterface $request, ResponseInterface $response, array $args)
{
$someData = ...;
$processedData = $this->processData($someData, $response);
return $response->withJson($processedData);
}
// in error handler
...
catch (DataProcessingException $e) {
return $response->withJson(['error' => 'A data processing exception has occurred', 'details' => $e->getMessage()], 500);
}
  1. 在任何错误时processData()抛出异常并在控制器中处理它:
private function processData(ResponseInterface $response)
{
...
$error = true; // simulate error
if($error){
throw new Exception('error message');
}
return $processedData;
}
// in your controller
public function __invoke(ServerRequestInterface $request, ResponseInterface $response, array $args)
{
$someData = ...;
try {
$processedData = $this->processData($someData, $response);
return $response->withJson($processedData);
}
catch (Exception $e) {
return $response->withJson('error', 500);
}
}
  1. processData()中,返回$processedData或某个值(例如FALSE(以指示错误,并在控制器中生成相应的响应(不推荐(:
private function processData(ResponseInterface $response)
{
...
$error = true; // simulate error
if($error){
return false;
}
return $processedData;
}
// in your controller
public function __invoke(ServerRequestInterface $request, ResponseInterface $response, array $args)
{
$someData = ...;
$processedData = $this->processData($someData, $response);
if ($processedData === false) {
return $response->withJson('error', 500);
}
return $response->withJson($processedData);
}

最新更新