How to catch errors in a service and return to a controller?
There are several ways you could go about this.

One that I tend to prefer is to go ahead and have your controller grab whatever data it needs from POST and populate a Model with it.

That model is what gets passed into your service layer.  Your service layer can run validation on the model (if any validation fails, you can retrieve the errors with $model-&gt;getErrors().

You can perform any additional custom logic and if any of that fails, use $model-&gt;addError() and return false.

Since the model will have been passed in by reference, your controller can see that false was returned and call $model-&gt;getErrors(), format those however you need and use $this-&gt;returnJson($myErrors) to send the errors back to the browser as JSON.