Может быть, я совершенно неправильно понял вопрос, но я бы сказал: выбросить исключение из вашей службы.
Но: вы поймаете исключение, только если сможете правильно с ним справиться. В вашем случае это выглядит так, как будто вы не можете справиться с этим в своей Службе, поэтому вы позволяете ему пузыриться к соответствующему компоненту Symfony (который отличается между консольной командой, контроллером или конечной точкой отдыха).
Служба не должна устанавливать код 500, так как не знает, в каком контексте она используется. Поэтому вы можете захотеть вызвать явное исключение ServiceException, перехватить его в вашем контроллере и преобразовать в нечто более полезное:
class A
{
public function foo(){
$tmp = [];
if($this->isOK($tmp)){
return $tmp;
}
throw new ServiceException('Failed checking $tmp');
}
private function isOK($tmp){
return false;
}
}
class TestController
{
/**
* @var A
*/
protected $a;
public function fooAction() {
try {
$this->a->foo();
} catch (ServiceException $e) {
throw new HttpException(500, $e->getMessage())
}
}
}
Для Интернета и отдыха вы должны убедиться, что ваше исключение имеет правильный код, который затем будет использоваться для установки HTTP-кода.
Только код, который использует сервис, знает, как правильно обрабатывать Исключение. Поскольку код состояния не имеет значения в вашей консольной команде, вы не можете его перехватить.
Но в целом вы можете сказать, что это не лучшая практика, поскольку вам, возможно, придется выполнить некоторую очистку (закрыть соединения, закрыть дескрипторы файлов, записать журнал ошибок), прежде чем Исключение будет передано на следующий уровень кода.
Пример для консоли:
class MyCommand extends Command
{
protected function execute(InputInterface $input, OutputInterface $output)
{
$io = new SymfonyStyle($input, $output);
$a = new A();
try {
$this->a->foo();
} catch (ServiceException $e) {
// write to log file
$io->error('Service failed: ' . $e->getMessage());
return;
}
// do more stuff
}
}