вы можете создать классы ошибок. И бросать исключения в тех или иных случаях, разделяя их по категориям "случившегося", а в контроллере можете навешивать обработчики на тот или иной тип исключений.
Вот пример из моего кода:
try {
$results = $core->execute($coreConfig);
}
catch (BreakpointException $e) {
throw $e;
}
catch (StrategiesException $e) {
$this->mark("Expected error:".$e->getMessage());
return $this->formattingResult(ProcessRecord::STATUS_ERROR,$e->getMessage());
}
catch (\Exception $e) {
$this->mark("Unexpected error:".$e->getMessage()."[".$e->getFile()."] : ".$e->getLine());
return $this->formattingResult(ProcessRecord::STATUS_UNEXPECTED_ERROR,$e->getMessage());
}
правда у меня это лежит в сервисе, но в принципе, зависит от логики работы.