如何 return 来自子函数调用的 Slim 响应?
How to return a Slim response from a subfunction call?
这个控制器(通过 __invoke 函数调用)调用另一个函数来处理一些数据,我想 return 来自第二个函数 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;
}
}
从子函数调用返回错误响应不起作用,因为必须从主函数return编辑响应。
我怎样才能做到这一点?
一个解决方案是从子函数中抛出一个错误,但我想 return 适当的精简响应。
据我了解 processData()
return 是发生任何错误时的响应对象,但 return 是另一种类型的数据。这意味着此方法在不同情况下 returning 两种不同类型的数据,因此在您的控制器中,您需要以不同方式处理其 return 值:如果它是 returning 响应对象,你可以 return 按原样,但如果它 return 是处理后的数据,你需要 return 使用该数据构建的 json 响应...这使事情成为有点混乱。
你关于抛出错误的想法似乎不错,你应该知道你可以(而且你必须)return 在出现任何错误时做出适当的反应。这就是为什么 Slim 错误处理程序应该 return 一个响应对象。
为了重构您的代码,我看到了这些选项:
- 在
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()
、return、$processedData
或某个值(例如FALSE
)中表示错误,在controller中,生成相应的响应(不推荐):
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);
}
这个控制器(通过 __invoke 函数调用)调用另一个函数来处理一些数据,我想 return 来自第二个函数 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;
}
}
从子函数调用返回错误响应不起作用,因为必须从主函数return编辑响应。
我怎样才能做到这一点?
一个解决方案是从子函数中抛出一个错误,但我想 return 适当的精简响应。
据我了解 processData()
return 是发生任何错误时的响应对象,但 return 是另一种类型的数据。这意味着此方法在不同情况下 returning 两种不同类型的数据,因此在您的控制器中,您需要以不同方式处理其 return 值:如果它是 returning 响应对象,你可以 return 按原样,但如果它 return 是处理后的数据,你需要 return 使用该数据构建的 json 响应...这使事情成为有点混乱。
你关于抛出错误的想法似乎不错,你应该知道你可以(而且你必须)return 在出现任何错误时做出适当的反应。这就是为什么 Slim 错误处理程序应该 return 一个响应对象。
为了重构您的代码,我看到了这些选项:
- 在
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()
、return、$processedData
或某个值(例如FALSE
)中表示错误,在controller中,生成相应的响应(不推荐):
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);
}