据我了解,processData() 在发生任何错误时返回响应对象,否则返回另一种类型的数据。这意味着这个方法在不同的情况下返回两种不同类型的数据,所以在你的控制器中你需要以不同的方式处理它的返回值:如果它返回一个响应对象,你可以按原样返回它,但如果它返回处理后的数据,您需要返回使用该数据构建的 json 响应......这让事情有点混乱。
您关于抛出错误的想法似乎很好,并且您应该知道您可以(并且必须)在出现任何错误时返回正确的响应。这就是 Slim 错误处理程序应该返回响应对象的原因。
要重构您的代码,我看到了以下选项:
- 在
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);
}
- 在出现任何错误时在
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);
}
}
- 在
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);
}