Как правильно передавать ошибки вверх по дереву вызовов классов?
Использовать Exceptions
php.net/manual/ru/language.exceptions.php
В случае если выбросить Exception в любом месте дерева вызовов он как раз будет пробираться до самого верха пока не попадется в catch блок
В месте где формируется сообщение (в контроллере) отлавливать и приводить в нужный вид
делать явную валидацию, а не как побочный эффект.$errors = $commentsModel->validate($comment);
if (!$errors) {
    $status = $commentsModel->save($comment);
}