我应该在控制器或服务中记录错误吗?
Should I log errors in a controller or in a service?
我有一个 Symfony 控制器,它基本上检查请求的参数是否在请求中,然后将这些参数传递给服务。该服务使用 Guzzle 调用 API,对结果执行一些操作,然后将其传递回控制器以显示带有响应的 Json。
我有一个关于错误处理的菜鸟问题,如果我用 Guzzle return 调用的 Api 出现错误,最好的解决方案是什么?
解决方案 1:我是否应该使用在我自己的服务中注入的 Logger 服务来记录错误,并且 return 将错误发送到我的控制器以便显示它。
解决方案 2:我应该在服务中抛出异常,在我的控制器中捕获它并在控制器中使用 $this->get("Logger") 以便在日志文件中记录错误
如果您的核心逻辑本身在服务中而不是在您的控制器中,那就太好了。
这样,您可以在调用另一个服务的服务内部使用 try-catch 块,并且您的控制器保持干净整洁 - 您只需调用该服务而不会捕获任何异常。
// AppBundle/src/Controller/MainController.php
public function mainAction()
{
// ...
$result = $this->get('my_service')->getResult($parameters);
if (!$result) {
// show an error message, pass it to another service, ignore it or whatever you like
}
}
// AppBundle/src/Service/MyService.php
public function getResult($parameters)
{
try {
$apiResult = $this->apiService->get($parameters);
} catch (ApiException $e)
$this->logger->error('My error message');
$apiResult = null;
}
return $apiResult;
}
另请考虑 解决方案 3:在服务中抛出异常并捕获它 in a custom exception listener,您可以在其中记录它并采取进一步的操作(例如替换 Response对象等)。
我有一个 Symfony 控制器,它基本上检查请求的参数是否在请求中,然后将这些参数传递给服务。该服务使用 Guzzle 调用 API,对结果执行一些操作,然后将其传递回控制器以显示带有响应的 Json。
我有一个关于错误处理的菜鸟问题,如果我用 Guzzle return 调用的 Api 出现错误,最好的解决方案是什么?
解决方案 1:我是否应该使用在我自己的服务中注入的 Logger 服务来记录错误,并且 return 将错误发送到我的控制器以便显示它。
解决方案 2:我应该在服务中抛出异常,在我的控制器中捕获它并在控制器中使用 $this->get("Logger") 以便在日志文件中记录错误
如果您的核心逻辑本身在服务中而不是在您的控制器中,那就太好了。
这样,您可以在调用另一个服务的服务内部使用 try-catch 块,并且您的控制器保持干净整洁 - 您只需调用该服务而不会捕获任何异常。
// AppBundle/src/Controller/MainController.php
public function mainAction()
{
// ...
$result = $this->get('my_service')->getResult($parameters);
if (!$result) {
// show an error message, pass it to another service, ignore it or whatever you like
}
}
// AppBundle/src/Service/MyService.php
public function getResult($parameters)
{
try {
$apiResult = $this->apiService->get($parameters);
} catch (ApiException $e)
$this->logger->error('My error message');
$apiResult = null;
}
return $apiResult;
}
另请考虑 解决方案 3:在服务中抛出异常并捕获它 in a custom exception listener,您可以在其中记录它并采取进一步的操作(例如替换 Response对象等)。