Не надо валить все в одну кучу. Тут и валидация пользовательского ввода, и бизнес-констрейнты, и фиг знает что свалено в кучу.
Конечно, во многом проблема типична для программистов на похапе с одним типом данным Map<String | Int, any>. Ну дык, а не надо так.
Внутри программы есть типы данных, в широком понимании. Интерфейс внутри программы строится на типах. Там, где встроенных в язык типов не хватает, делаются собственные. В PHP свои типы делаются с помощью классов, при невозможности преобразования типа из более "широкого" в более "узкий" (скажем, из произвольной строки в тип username, определенный как "строка от 1 до 20 символов a-z0-9_" выбрасывается исключение из конструктора, принимающего строку).
Что касается данных от клиента (грубо говоря пользовательский ввод) - это обычно какая-то generic-структура, типа form-data (которая Map<String, String>) или json, которую надо отдельно провалидировать и отдать клиенту ответ в понятном ему формате (в т.ч. с ошибками). Это отдельный этап валидации, относящийся к интерфейсу между сервером и клиентом.
Что касаемо "мусора" в сообщении - непонятно, что такое мусор. Невалидный юникод? Превышение длины сообщения? Сообщение "за 10 грамм роскомнадзора"? Надо не выдумывать из головы, а определиться с бизнес- и техническими констрейнтами.